Ext = {
    version: "2.2"
};
window["undefined"] = window["undefined"];
Ext.apply = function(C, D, B) {
    if (B) {
        Ext.apply(C, B)
    }
    if (C && D && typeof D == "object") {
        for (var A in D) {
            C[A] = D[A]
        }
    }
    return C
};
(function() {
    var idSeed = 0;
    var ua = navigator.userAgent.toLowerCase();
    var isStrict = document.compatMode == "CSS1Compat",
    isOpera = ua.indexOf("opera") > -1,
    isSafari = (/webkit|khtml/).test(ua),
    isSafari3 = isSafari && ua.indexOf("webkit/5") != -1,
    isIE = !isOpera && ua.indexOf("msie") > -1,
    isIE7 = !isOpera && ua.indexOf("msie 7") > -1,
    isGecko = !isSafari && ua.indexOf("gecko") > -1,
    isGecko3 = !isSafari && ua.indexOf("rv:1.9") > -1,
    isBorderBox = isIE && !isStrict,
    isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1),
    isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1),
    isAir = (ua.indexOf("adobeair") != -1),
    isLinux = (ua.indexOf("linux") != -1),
    isSecure = window.location.href.toLowerCase().indexOf("https") === 0;
    if (isIE && !isIE7) {
        try {
            document.execCommand("BackgroundImageCache", false, true)
        } catch(e) {}
    }
    Ext.apply(Ext, {
        isStrict: isStrict,
        isSecure: isSecure,
        isReady: false,
        enableGarbageCollector: true,
        enableListenerCollection: false,
        SSL_SECURE_URL: "javascript:false",
        BLANK_IMAGE_URL: "http:/" + "/extjs.com/s.gif",
        emptyFn: function() {},
        applyIf: function(o, c) {
            if (o && c) {
                for (var p in c) {
                    if (typeof o[p] == "undefined") {
                        o[p] = c[p]
                    }
                }
            }
            return o
        },
        addBehaviors: function(o) {
            if (!Ext.isReady) {
                Ext.onReady(function() {
                    Ext.addBehaviors(o)
                });
                return
            }
            var cache = {};
            for (var b in o) {
                var parts = b.split("@");
                if (parts[1]) {
                    var s = parts[0];
                    if (!cache[s]) {
                        cache[s] = Ext.select(s)
                    }
                    cache[s].on(parts[1], o[b])
                }
            }
            cache = null
        },
        id: function(el, prefix) {
            prefix = prefix || "ext-gen";
            el = Ext.getDom(el);
            var id = prefix + (++idSeed);
            return el ? (el.id ? el.id: (el.id = id)) : id
        },
        extend: function() {
            var io = function(o) {
                for (var m in o) {
                    this[m] = o[m]
                }
            };
            var oc = Object.prototype.constructor;
            return function(sb, sp, overrides) {
                if (typeof sp == "object") {
                    overrides = sp;
                    sp = sb;
                    sb = overrides.constructor != oc ? overrides.constructor: function() {
                        sp.apply(this, arguments)
                    }
                }
                var F = function() {},
                sbp,
                spp = sp.prototype;
                F.prototype = spp;
                sbp = sb.prototype = new F();
                sbp.constructor = sb;
                sb.superclass = spp;
                if (spp.constructor == oc) {
                    spp.constructor = sp
                }
                sb.override = function(o) {
                    Ext.override(sb, o)
                };
                sbp.override = io;
                Ext.override(sb, overrides);
                sb.extend = function(o) {
                    Ext.extend(sb, o)
                };
                return sb
            }
        } (),
        override: function(origclass, overrides) {
            if (overrides) {
                var p = origclass.prototype;
                for (var method in overrides) {
                    p[method] = overrides[method]
                }
            }
        },
        namespace: function() {
            var a = arguments,
            o = null,
            i, j, d, rt;
            for (i = 0; i < a.length; ++i) {
                d = a[i].split(".");
                rt = d[0];
                eval("if (typeof " + rt + " == \"undefined\"){" + rt + " = {};} o = " + rt + ";");
                for (j = 1; j < d.length; ++j) {
                    o[d[j]] = o[d[j]] || {};
                    o = o[d[j]]
                }
            }
        },
        urlEncode: function(o) {
            if (!o) {
                return ""
            }
            var buf = [];
            for (var key in o) {
                var ov = o[key],
                k = encodeURIComponent(key);
                var type = typeof ov;
                if (type == "undefined") {
                    buf.push(k, "=&")
                } else {
                    if (type != "function" && type != "object") {
                        buf.push(k, "=", encodeURIComponent(ov), "&")
                    } else {
                        if (Ext.isArray(ov)) {
                            if (ov.length) {
                                for (var i = 0, len = ov.length; i < len; i++) {
                                    buf.push(k, "=", encodeURIComponent(ov[i] === undefined ? "": ov[i]), "&")
                                }
                            } else {
                                buf.push(k, "=&")
                            }
                        }
                    }
                }
            }
            buf.pop();
            return buf.join("")
        },
        urlDecode: function(string, overwrite) {
            if (!string || !string.length) {
                return {}
            }
            var obj = {};
            var pairs = string.split("&");
            var pair, name, value;
            for (var i = 0, len = pairs.length; i < len; i++) {
                pair = pairs[i].split("=");
                name = decodeURIComponent(pair[0]);
                value = decodeURIComponent(pair[1]);
                if (overwrite !== true) {
                    if (typeof obj[name] == "undefined") {
                        obj[name] = value
                    } else {
                        if (typeof obj[name] == "string") {
                            obj[name] = [obj[name]];
                            obj[name].push(value)
                        } else {
                            obj[name].push(value)
                        }
                    }
                } else {
                    obj[name] = value
                }
            }
            return obj
        },
        each: function(array, fn, scope) {
            if (typeof array.length == "undefined" || typeof array == "string") {
                array = [array]
            }
            for (var i = 0, len = array.length; i < len; i++) {
                if (fn.call(scope || array[i], array[i], i, array) === false) {
                    return i
                }
            }
        },
        combine: function() {
            var as = arguments,
            l = as.length,
            r = [];
            for (var i = 0; i < l; i++) {
                var a = as[i];
                if (Ext.isArray(a)) {
                    r = r.concat(a)
                } else {
                    if (a.length !== undefined && !a.substr) {
                        r = r.concat(Array.prototype.slice.call(a, 0))
                    } else {
                        r.push(a)
                    }
                }
            }
            return r
        },
        escapeRe: function(s) {
            return s.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1")
        },
        callback: function(cb, scope, args, delay) {
            if (typeof cb == "function") {
                if (delay) {
                    cb.defer(delay, scope, args || [])
                } else {
                    cb.apply(scope, args || [])
                }
            }
        },
        getDom: function(el) {
            if (!el || !document) {
                return null
            }
            return el.dom ? el.dom: (typeof el == "string" ? document.getElementById(el) : el)
        },
        getDoc: function() {
            return Ext.get(document)
        },
        getBody: function() {
            return Ext.get(document.body || document.documentElement)
        },
        getCmp: function(id) {
            return Ext.ComponentMgr.get(id)
        },
        num: function(v, defaultValue) {
            if (typeof v != "number") {
                return defaultValue
            }
            return v
        },
        destroy: function() {
            for (var i = 0, a = arguments, len = a.length; i < len; i++) {
                var as = a[i];
                if (as) {
                    if (typeof as.destroy == "function") {
                        as.destroy()
                    } else {
                        if (as.dom) {
                            as.removeAllListeners();
                            as.remove()
                        }
                    }
                }
            }
        },
        removeNode: isIE ?
        function() {
            var d;
            return function(n) {
                if (n && n.tagName != "BODY") {
                    d = d || document.createElement("div");
                    d.appendChild(n);
                    d.innerHTML = ""
                }
            }
        } () : function(n) {
            if (n && n.parentNode && n.tagName != "BODY") {
                n.parentNode.removeChild(n)
            }
        },
        type: function(o) {
            if (o === undefined || o === null) {
                return false
            }
            if (o.htmlElement) {
                return "element"
            }
            var t = typeof o;
            if (t == "object" && o.nodeName) {
                switch (o.nodeType) {
                case 1:
                    return "element";
                case 3:
                    return (/\S/).test(o.nodeValue) ? "textnode": "whitespace"
                }
            }
            if (t == "object" || t == "function") {
                switch (o.constructor) {
                case Array:
                    return "array";
                case RegExp:
                    return "regexp"
                }
                if (typeof o.length == "number" && typeof o.item == "function") {
                    return "nodelist"
                }
            }
            return t
        },
        isEmpty: function(v, allowBlank) {
            return v === null || v === undefined || (!allowBlank ? v === "": false)
        },
        value: function(v, defaultValue, allowBlank) {
            return Ext.isEmpty(v, allowBlank) ? defaultValue: v
        },
        isArray: function(v) {
            return v && typeof v.length == "number" && typeof v.splice == "function"
        },
        isDate: function(v) {
            return v && typeof v.getFullYear == "function"
        },
        isOpera: isOpera,
        isSafari: isSafari,
        isSafari3: isSafari3,
        isSafari2: isSafari && !isSafari3,
        isIE: isIE,
        isIE6: isIE && !isIE7,
        isIE7: isIE7,
        isGecko: isGecko,
        isGecko2: isGecko && !isGecko3,
        isGecko3: isGecko3,
        isBorderBox: isBorderBox,
        isLinux: isLinux,
        isWindows: isWindows,
        isMac: isMac,
        isAir: isAir,
        useShims: ((isIE && !isIE7) || (isMac && isGecko && !isGecko3))
    });
    Ext.ns = Ext.namespace
})();
Ext.ns("Ext", "Ext.util", "Ext.grid", "Ext.dd", "Ext.tree", "Ext.data", "Ext.form", "Ext.menu", "Ext.state", "Ext.lib", "Ext.layout", "Ext.app", "Ext.ux");
Ext.apply(Function.prototype, {
    createCallback: function() {
        var A = arguments;
        var B = this;
        return function() {
            return B.apply(window, A)
        }
    },
    createDelegate: function(C, B, A) {
        var D = this;
        return function() {
            var F = B || arguments;
            if (A === true) {
                F = Array.prototype.slice.call(arguments, 0);
                F = F.concat(B)
            } else {
                if (typeof A == "number") {
                    F = Array.prototype.slice.call(arguments, 0);
                    var E = [A, 0].concat(B);
                    Array.prototype.splice.apply(F, E)
                }
            }
            return D.apply(C || window, F)
        }
    },
    defer: function(C, E, B, A) {
        var D = this.createDelegate(E, B, A);
        if (C) {
            return setTimeout(D, C)
        }
        D();
        return 0
    },
    createSequence: function(B, A) {
        if (typeof B != "function") {
            return this
        }
        var C = this;
        return function() {
            var D = C.apply(this || window, arguments);
            B.apply(A || this || window, arguments);
            return D
        }
    },
    createInterceptor: function(B, A) {
        if (typeof B != "function") {
            return this
        }
        var C = this;
        return function() {
            B.target = this;
            B.method = C;
            if (B.apply(A || this || window, arguments) === false) {
                return
            }
            return C.apply(this || window, arguments)
        }
    }
});
Ext.applyIf(String, {
    escape: function(A) {
        return A.replace(/('|\\)/g, "\\$1")
    },
    leftPad: function(D, B, C) {
        var A = new String(D);
        if (!C) {
            C = " "
        }
        while (A.length < B) {
            A = C + A
        }
        return A.toString()
    },
    format: function(B) {
        var A = Array.prototype.slice.call(arguments, 1);
        return B.replace(/\{(\d+)\}/g,
        function(C, D) {
            return A[D]
        })
    }
});
String.prototype.toggle = function(B, A) {
    return this == B ? A: B
};
String.prototype.trim = function() {
    var A = /^\s+|\s+$/g;
    return function() {
        return this.replace(A, "")
    }
} ();
Ext.applyIf(Number.prototype, {
    constrain: function(B, A) {
        return Math.min(Math.max(this, B), A)
    }
});
Ext.applyIf(Array.prototype, {
    indexOf: function(C) {
        for (var B = 0, A = this.length; B < A; B++) {
            if (this[B] == C) {
                return B
            }
        }
        return - 1
    },
    remove: function(B) {
        var A = this.indexOf(B);
        if (A != -1) {
            this.splice(A, 1)
        }
        return this
    }
});
Date.prototype.getElapsed = function(A) {
    return Math.abs((A || new Date()).getTime() - this.getTime())
};
(function() {
    var B;
    Ext.lib.Dom = {
        getViewWidth: function(E) {
            return E ? this.getDocumentWidth() : this.getViewportWidth()
        },
        getViewHeight: function(E) {
            return E ? this.getDocumentHeight() : this.getViewportHeight()
        },
        getDocumentHeight: function() {
            var E = (document.compatMode != "CSS1Compat") ? document.body.scrollHeight: document.documentElement.scrollHeight;
            return Math.max(E, this.getViewportHeight())
        },
        getDocumentWidth: function() {
            var E = (document.compatMode != "CSS1Compat") ? document.body.scrollWidth: document.documentElement.scrollWidth;
            return Math.max(E, this.getViewportWidth())
        },
        getViewportHeight: function() {
            if (Ext.isIE) {
                return Ext.isStrict ? document.documentElement.clientHeight: document.body.clientHeight
            } else {
                return self.innerHeight
            }
        },
        getViewportWidth: function() {
            if (Ext.isIE) {
                return Ext.isStrict ? document.documentElement.clientWidth: document.body.clientWidth
            } else {
                return self.innerWidth
            }
        },
        isAncestor: function(F, G) {
            F = Ext.getDom(F);
            G = Ext.getDom(G);
            if (!F || !G) {
                return false
            }
            if (F.contains && !Ext.isSafari) {
                return F.contains(G)
            } else {
                if (F.compareDocumentPosition) {
                    return !! (F.compareDocumentPosition(G) & 16)
                } else {
                    var E = G.parentNode;
                    while (E) {
                        if (E == F) {
                            return true
                        } else {
                            if (!E.tagName || E.tagName.toUpperCase() == "HTML") {
                                return false
                            }
                        }
                        E = E.parentNode
                    }
                    return false
                }
            }
        },
        getRegion: function(E) {
            return Ext.lib.Region.getRegion(E)
        },
        getY: function(E) {
            return this.getXY(E)[1]
        },
        getX: function(E) {
            return this.getXY(E)[0]
        },
        getXY: function(G) {
            var F, K, M, N, J = (document.body || document.documentElement);
            G = Ext.getDom(G);
            if (G == J) {
                return [0, 0]
            }
            if (G.getBoundingClientRect) {
                M = G.getBoundingClientRect();
                N = C(document).getScroll();
                return [M.left + N.left, M.top + N.top]
            }
            var O = 0,
            L = 0;
            F = G;
            var E = C(G).getStyle("position") == "absolute";
            while (F) {
                O += F.offsetLeft;
                L += F.offsetTop;
                if (!E && C(F).getStyle("position") == "absolute") {
                    E = true
                }
                if (Ext.isGecko) {
                    K = C(F);
                    var P = parseInt(K.getStyle("borderTopWidth"), 10) || 0;
                    var H = parseInt(K.getStyle("borderLeftWidth"), 10) || 0;
                    O += H;
                    L += P;
                    if (F != G && K.getStyle("overflow") != "visible") {
                        O += H;
                        L += P
                    }
                }
                F = F.offsetParent
            }
            if (Ext.isSafari && E) {
                O -= J.offsetLeft;
                L -= J.offsetTop
            }
            if (Ext.isGecko && !E) {
                var I = C(J);
                O += parseInt(I.getStyle("borderLeftWidth"), 10) || 0;
                L += parseInt(I.getStyle("borderTopWidth"), 10) || 0
            }
            F = G.parentNode;
            while (F && F != J) {
                if (!Ext.isOpera || (F.tagName != "TR" && C(F).getStyle("display") != "inline")) {
                    O -= F.scrollLeft;
                    L -= F.scrollTop
                }
                F = F.parentNode
            }
            return [O, L]
        },
        setXY: function(E, F) {
            E = Ext.fly(E, "_setXY");
            E.position();
            var G = E.translatePoints(F);
            if (F[0] !== false) {
                E.dom.style.left = G.left + "px"
            }
            if (F[1] !== false) {
                E.dom.style.top = G.top + "px"
            }
        },
        setX: function(F, E) {
            this.setXY(F, [E, false])
        },
        setY: function(E, F) {
            this.setXY(E, [false, F])
        }
    };
    Ext.lib.Event = function() {
        var F = false;
        var G = [];
        var K = [];
        var I = 0;
        var H = [];
        var E = 0;
        var J = null;
        return {
            POLL_RETRYS: 200,
            POLL_INTERVAL: 20,
            EL: 0,
            TYPE: 1,
            FN: 2,
            WFN: 3,
            OBJ: 3,
            ADJ_SCOPE: 4,
            _interval: null,
            startInterval: function() {
                if (!this._interval) {
                    var L = this;
                    var M = function() {
                        L._tryPreloadAttach()
                    };
                    this._interval = setInterval(M, this.POLL_INTERVAL)
                }
            },
            onAvailable: function(N, L, O, M) {
                H.push({
                    id: N,
                    fn: L,
                    obj: O,
                    override: M,
                    checkReady: false
                });
                I = this.POLL_RETRYS;
                this.startInterval()
            },
            addListener: function(Q, M, P) {
                Q = Ext.getDom(Q);
                if (!Q || !P) {
                    return false
                }
                if ("unload" == M) {
                    K[K.length] = [Q, M, P];
                    return true
                }
                var O = function(R) {
                    return typeof Ext != "undefined" ? P(Ext.lib.Event.getEvent(R)) : false
                };
                var L = [Q, M, P, O];
                var N = G.length;
                G[N] = L;
                this.doAdd(Q, M, O, false);
                return true
            },
            removeListener: function(S, O, R) {
                var Q, N;
                S = Ext.getDom(S);
                if (!R) {
                    return this.purgeElement(S, false, O)
                }
                if ("unload" == O) {
                    for (Q = 0, N = K.length; Q < N; Q++) {
                        var M = K[Q];
                        if (M && M[0] == S && M[1] == O && M[2] == R) {
                            K.splice(Q, 1);
                            return true
                        }
                    }
                    return false
                }
                var L = null;
                var P = arguments[3];
                if ("undefined" == typeof P) {
                    P = this._getCacheIndex(S, O, R)
                }
                if (P >= 0) {
                    L = G[P]
                }
                if (!S || !L) {
                    return false
                }
                this.doRemove(S, O, L[this.WFN], false);
                delete G[P][this.WFN];
                delete G[P][this.FN];
                G.splice(P, 1);
                return true
            },
            getTarget: function(N, M) {
                N = N.browserEvent || N;
                var L = N.target || N.srcElement;
                return this.resolveTextNode(L)
            },
            resolveTextNode: function(L) {
                if (Ext.isSafari && L && 3 == L.nodeType) {
                    return L.parentNode
                } else {
                    return L
                }
            },
            getPageX: function(M) {
                M = M.browserEvent || M;
                var L = M.pageX;
                if (!L && 0 !== L) {
                    L = M.clientX || 0;
                    if (Ext.isIE) {
                        L += this.getScroll()[1]
                    }
                }
                return L
            },
            getPageY: function(L) {
                L = L.browserEvent || L;
                var M = L.pageY;
                if (!M && 0 !== M) {
                    M = L.clientY || 0;
                    if (Ext.isIE) {
                        M += this.getScroll()[0]
                    }
                }
                return M
            },
            getXY: function(L) {
                L = L.browserEvent || L;
                return [this.getPageX(L), this.getPageY(L)]
            },
            getRelatedTarget: function(M) {
                M = M.browserEvent || M;
                var L = M.relatedTarget;
                if (!L) {
                    if (M.type == "mouseout") {
                        L = M.toElement
                    } else {
                        if (M.type == "mouseover") {
                            L = M.fromElement
                        }
                    }
                }
                return this.resolveTextNode(L)
            },
            getTime: function(N) {
                N = N.browserEvent || N;
                if (!N.time) {
                    var M = new Date().getTime();
                    try {
                        N.time = M
                    } catch(L) {
                        this.lastError = L;
                        return M
                    }
                }
                return N.time
            },
            stopEvent: function(L) {
                this.stopPropagation(L);
                this.preventDefault(L)
            },
            stopPropagation: function(L) {
                L = L.browserEvent || L;
                if (L.stopPropagation) {
                    L.stopPropagation()
                } else {
                    L.cancelBubble = true
                }
            },
            preventDefault: function(L) {
                L = L.browserEvent || L;
                if (L.preventDefault) {
                    L.preventDefault()
                } else {
                    L.returnValue = false
                }
            },
            getEvent: function(M) {
                var L = M || window.event;
                if (!L) {
                    var N = this.getEvent.caller;
                    while (N) {
                        L = N.arguments[0];
                        if (L && Event == L.constructor) {
                            break
                        }
                        N = N.caller
                    }
                }
                return L
            },
            getCharCode: function(L) {
                L = L.browserEvent || L;
                return L.charCode || L.keyCode || 0
            },
            _getCacheIndex: function(Q, N, P) {
                for (var O = 0, M = G.length; O < M; ++O) {
                    var L = G[O];
                    if (L && L[this.FN] == P && L[this.EL] == Q && L[this.TYPE] == N) {
                        return O
                    }
                }
                return - 1
            },
            elCache: {},
            getEl: function(L) {
                return document.getElementById(L)
            },
            clearCache: function() {},
            _load: function(M) {
                F = true;
                var L = Ext.lib.Event;
                if (Ext.isIE) {
                    L.doRemove(window, "load", L._load)
                }
            },
            _tryPreloadAttach: function() {
                if (this.locked) {
                    return false
                }
                this.locked = true;
                var R = !F;
                if (!R) {
                    R = (I > 0)
                }
                var Q = [];
                for (var M = 0, L = H.length; M < L; ++M) {
                    var P = H[M];
                    if (P) {
                        var O = this.getEl(P.id);
                        if (O) {
                            if (!P.checkReady || F || O.nextSibling || (document && document.body)) {
                                var N = O;
                                if (P.override) {
                                    if (P.override === true) {
                                        N = P.obj
                                    } else {
                                        N = P.override
                                    }
                                }
                                P.fn.call(N, P.obj);
                                H[M] = null
                            }
                        } else {
                            Q.push(P)
                        }
                    }
                }
                I = (Q.length === 0) ? 0 : I - 1;
                if (R) {
                    this.startInterval()
                } else {
                    clearInterval(this._interval);
                    this._interval = null
                }
                this.locked = false;
                return true
            },
            purgeElement: function(P, Q, N) {
                var R = this.getListeners(P, N);
                if (R) {
                    for (var O = 0, L = R.length; O < L; ++O) {
                        var M = R[O];
                        this.removeListener(P, M.type, M.fn)
                    }
                }
                if (Q && P && P.childNodes) {
                    for (O = 0, L = P.childNodes.length; O < L; ++O) {
                        this.purgeElement(P.childNodes[O], Q, N)
                    }
                }
            },
            getListeners: function(M, R) {
                var P = [],
                L;
                if (!R) {
                    L = [G, K]
                } else {
                    if (R == "unload") {
                        L = [K]
                    } else {
                        L = [G]
                    }
                }
                for (var O = 0; O < L.length; ++O) {
                    var T = L[O];
                    if (T && T.length > 0) {
                        for (var Q = 0, S = T.length; Q < S; ++Q) {
                            var N = T[Q];
                            if (N && N[this.EL] === M && (!R || R === N[this.TYPE])) {
                                P.push({
                                    type: N[this.TYPE],
                                    fn: N[this.FN],
                                    obj: N[this.OBJ],
                                    adjust: N[this.ADJ_SCOPE],
                                    index: Q
                                })
                            }
                        }
                    }
                }
                return (P.length) ? P: null
            },
            _unload: function(S) {
                var R = Ext.lib.Event,
                P, O, M, L, N;
                for (P = 0, L = K.length; P < L; ++P) {
                    M = K[P];
                    if (M) {
                        var Q = window;
                        if (M[R.ADJ_SCOPE]) {
                            if (M[R.ADJ_SCOPE] === true) {
                                Q = M[R.OBJ]
                            } else {
                                Q = M[R.ADJ_SCOPE]
                            }
                        }
                        M[R.FN].call(Q, R.getEvent(S), M[R.OBJ]);
                        K[P] = null;
                        M = null;
                        Q = null
                    }
                }
                K = null;
                if (G && G.length > 0) {
                    O = G.length;
                    while (O) {
                        N = O - 1;
                        M = G[N];
                        if (M) {
                            R.removeListener(M[R.EL], M[R.TYPE], M[R.FN], N)
                        }
                        O = O - 1
                    }
                    M = null;
                    R.clearCache()
                }
                R.doRemove(window, "unload", R._unload)
            },
            getScroll: function() {
                var L = document.documentElement,
                M = document.body;
                if (L && (L.scrollTop || L.scrollLeft)) {
                    return [L.scrollTop, L.scrollLeft]
                } else {
                    if (M) {
                        return [M.scrollTop, M.scrollLeft]
                    } else {
                        return [0, 0]
                    }
                }
            },
            doAdd: function() {
                if (window.addEventListener) {
                    return function(O, M, N, L) {
                        O.addEventListener(M, N, (L))
                    }
                } else {
                    if (window.attachEvent) {
                        return function(O, M, N, L) {
                            O.attachEvent("on" + M, N)
                        }
                    } else {
                        return function() {}
                    }
                }
            } (),
            doRemove: function() {
                if (window.removeEventListener) {
                    return function(O, M, N, L) {
                        O.removeEventListener(M, N, (L))
                    }
                } else {
                    if (window.detachEvent) {
                        return function(N, L, M) {
                            N.detachEvent("on" + L, M)
                        }
                    } else {
                        return function() {}
                    }
                }
            } ()
        }
    } ();
    var D = Ext.lib.Event;
    D.on = D.addListener;
    D.un = D.removeListener;
    if (document && document.body) {
        D._load()
    } else {
        D.doAdd(window, "load", D._load)
    }
    D.doAdd(window, "unload", D._unload);
    D._tryPreloadAttach();
    Ext.lib.Ajax = {
        request: function(K, I, E, J, F) {
            if (F) {
                var G = F.headers;
                if (G) {
                    for (var H in G) {
                        if (G.hasOwnProperty(H)) {
                            this.initHeader(H, G[H], false)
                        }
                    }
                }
                if (F.xmlData) {
                    if (!G || !G["Content-Type"]) {
                        this.initHeader("Content-Type", "text/xml", false)
                    }
                    K = (K ? K: (F.method ? F.method: "POST"));
                    J = F.xmlData
                } else {
                    if (F.jsonData) {
                        if (!G || !G["Content-Type"]) {
                            this.initHeader("Content-Type", "application/json", false)
                        }
                        K = (K ? K: (F.method ? F.method: "POST"));
                        J = typeof F.jsonData == "object" ? Ext.encode(F.jsonData) : F.jsonData
                    }
                }
            }
            return this.asyncRequest(K, I, E, J)
        },
        serializeForm: function(F) {
            if (typeof F == "string") {
                F = (document.getElementById(F) || document.forms[F])
            }
            var G, E, H, J, K = "",
            M = false;
            for (var L = 0; L < F.elements.length; L++) {
                G = F.elements[L];
                J = F.elements[L].disabled;
                E = F.elements[L].name;
                H = F.elements[L].value;
                if (!J && E) {
                    switch (G.type) {
                    case "select-one":
                    case "select-multiple":
                        for (var I = 0; I < G.options.length; I++) {
                            if (G.options[I].selected) {
                                if (Ext.isIE) {
                                    K += encodeURIComponent(E) + "=" + encodeURIComponent(G.options[I].attributes["value"].specified ? G.options[I].value: G.options[I].text) + "&"
                                } else {
                                    K += encodeURIComponent(E) + "=" + encodeURIComponent(G.options[I].hasAttribute("value") ? G.options[I].value: G.options[I].text) + "&"
                                }
                            }
                        }
                        break;
                    case "radio":
                    case "checkbox":
                        if (G.checked) {
                            K += encodeURIComponent(E) + "=" + encodeURIComponent(H) + "&"
                        }
                        break;
                    case "file":
                    case undefined:
                    case "reset":
                    case "button":
                        break;
                    case "submit":
                        if (M == false) {
                            K += encodeURIComponent(E) + "=" + encodeURIComponent(H) + "&";
                            M = true
                        }
                        break;
                    default:
                        K += encodeURIComponent(E) + "=" + encodeURIComponent(H) + "&";
                        break
                    }
                }
            }
            K = K.substr(0, K.length - 1);
            return K
        },
        headers: {},
        hasHeaders: false,
        useDefaultHeader: true,
        defaultPostHeader: "application/x-www-form-urlencoded; charset=UTF-8",
        useDefaultXhrHeader: true,
        defaultXhrHeader: "XMLHttpRequest",
        hasDefaultHeaders: true,
        defaultHeaders: {},
        poll: {},
        timeout: {},
        pollInterval: 50,
        transactionId: 0,
        setProgId: function(E) {
            this.activeX.unshift(E)
        },
        setDefaultPostHeader: function(E) {
            this.useDefaultHeader = E
        },
        setDefaultXhrHeader: function(E) {
            this.useDefaultXhrHeader = E
        },
        setPollingInterval: function(E) {
            if (typeof E == "number" && isFinite(E)) {
                this.pollInterval = E
            }
        },
        createXhrObject: function(I) {
            var H, E;
            try {
                E = new XMLHttpRequest();
                H = {
                    conn: E,
                    tId: I
                }
            } catch(G) {
                for (var F = 0; F < this.activeX.length; ++F) {
                    try {
                        E = new ActiveXObject(this.activeX[F]);
                        H = {
                            conn: E,
                            tId: I
                        };
                        break
                    } catch(G) {}
                }
            } finally {
                return H
            }
        },
        getConnectionObject: function() {
            var F;
            var G = this.transactionId;
            try {
                F = this.createXhrObject(G);
                if (F) {
                    this.transactionId++
                }
            } catch(E) {} finally {
                return F
            }
        },
        asyncRequest: function(I, F, H, E) {
            var G = this.getConnectionObject();
            if (!G) {
                return null
            } else {
                G.conn.open(I, F, true);
                if (this.useDefaultXhrHeader) {
                    if (!this.defaultHeaders["X-Requested-With"]) {
                        this.initHeader("X-Requested-With", this.defaultXhrHeader, true)
                    }
                }
                if (E && this.useDefaultHeader && (!this.hasHeaders || !this.headers["Content-Type"])) {
                    this.initHeader("Content-Type", this.defaultPostHeader)
                }
                if (this.hasDefaultHeaders || this.hasHeaders) {
                    this.setHeader(G)
                }
                this.handleReadyState(G, H);
                G.conn.send(E || null);
                return G
            }
        },
        handleReadyState: function(F, G) {
            var E = this;
            if (G && G.timeout) {
                this.timeout[F.tId] = window.setTimeout(function() {
                    E.abort(F, G, true)
                },
                G.timeout)
            }
            this.poll[F.tId] = window.setInterval(function() {
                if (F.conn && F.conn.readyState == 4) {
                    window.clearInterval(E.poll[F.tId]);
                    delete E.poll[F.tId];
                    if (G && G.timeout) {
                        window.clearTimeout(E.timeout[F.tId]);
                        delete E.timeout[F.tId]
                    }
                    E.handleTransactionResponse(F, G)
                }
            },
            this.pollInterval)
        },
        handleTransactionResponse: function(I, J, E) {
            if (!J) {
                this.releaseObject(I);
                return
            }
            var G, F;
            try {
                if (I.conn.status !== undefined && I.conn.status != 0) {
                    G = I.conn.status
                } else {
                    G = 13030
                }
            } catch(H) {
                G = 13030
            }
            if (G >= 200 && G < 300) {
                F = this.createResponseObject(I, J.argument);
                if (J.success) {
                    if (!J.scope) {
                        J.success(F)
                    } else {
                        J.success.apply(J.scope, [F])
                    }
                }
            } else {
                switch (G) {
                case 12002:
                case 12029:
                case 12030:
                case 12031:
                case 12152:
                case 13030:
                    F = this.createExceptionObject(I.tId, J.argument, (E ? E: false));
                    if (J.failure) {
                        if (!J.scope) {
                            J.failure(F)
                        } else {
                            J.failure.apply(J.scope, [F])
                        }
                    }
                    break;
                default:
                    F = this.createResponseObject(I, J.argument);
                    if (J.failure) {
                        if (!J.scope) {
                            J.failure(F)
                        } else {
                            J.failure.apply(J.scope, [F])
                        }
                    }
                }
            }
            this.releaseObject(I);
            F = null
        },
        createResponseObject: function(E, K) {
            var H = {};
            var M = {};
            try {
                var G = E.conn.getAllResponseHeaders();
                var J = G.split("\n");
                for (var I = 0; I < J.length; I++) {
                    var F = J[I].indexOf(":");
                    if (F != -1) {
                        M[J[I].substring(0, F)] = J[I].substring(F + 2)
                    }
                }
            } catch(L) {}
            H.tId = E.tId;
            H.status = E.conn.status;
            H.statusText = E.conn.statusText;
            H.getResponseHeader = M;
            H.getAllResponseHeaders = G;
            H.responseText = E.conn.responseText;
            H.responseXML = E.conn.responseXML;
            if (typeof K !== undefined) {
                H.argument = K
            }
            return H
        },
        createExceptionObject: function(L, H, E) {
            var J = 0;
            var K = "communication failure";
            var G = -1;
            var F = "transaction aborted";
            var I = {};
            I.tId = L;
            if (E) {
                I.status = G;
                I.statusText = F
            } else {
                I.status = J;
                I.statusText = K
            }
            if (H) {
                I.argument = H
            }
            return I
        },
        initHeader: function(E, H, G) {
            var F = (G) ? this.defaultHeaders: this.headers;
            if (F[E] === undefined) {
                F[E] = H
            } else {
                F[E] = H + "," + F[E]
            }
            if (G) {
                this.hasDefaultHeaders = true
            } else {
                this.hasHeaders = true
            }
        },
        setHeader: function(E) {
            if (this.hasDefaultHeaders) {
                for (var F in this.defaultHeaders) {
                    if (this.defaultHeaders.hasOwnProperty(F)) {
                        E.conn.setRequestHeader(F, this.defaultHeaders[F])
                    }
                }
            }
            if (this.hasHeaders) {
                for (var F in this.headers) {
                    if (this.headers.hasOwnProperty(F)) {
                        E.conn.setRequestHeader(F, this.headers[F])
                    }
                }
                this.headers = {};
                this.hasHeaders = false
            }
        },
        resetDefaultHeaders: function() {
            delete this.defaultHeaders;
            this.defaultHeaders = {};
            this.hasDefaultHeaders = false
        },
        abort: function(F, G, E) {
            if (this.isCallInProgress(F)) {
                F.conn.abort();
                window.clearInterval(this.poll[F.tId]);
                delete this.poll[F.tId];
                if (E) {
                    delete this.timeout[F.tId]
                }
                this.handleTransactionResponse(F, G, true);
                return true
            } else {
                return false
            }
        },
        isCallInProgress: function(E) {
            if (E.conn) {
                return E.conn.readyState != 4 && E.conn.readyState != 0
            } else {
                return false
            }
        },
        releaseObject: function(E) {
            E.conn = null;
            E = null
        },
        activeX: ["MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]
    };
    Ext.lib.Region = function(G, H, E, F) {
        this.top = G;
        this[1] = G;
        this.right = H;
        this.bottom = E;
        this.left = F;
        this[0] = F
    };
    Ext.lib.Region.prototype = {
        contains: function(E) {
            return (E.left >= this.left && E.right <= this.right && E.top >= this.top && E.bottom <= this.bottom)
        },
        getArea: function() {
            return ((this.bottom - this.top) * (this.right - this.left))
        },
        intersect: function(I) {
            var G = Math.max(this.top, I.top);
            var H = Math.min(this.right, I.right);
            var E = Math.min(this.bottom, I.bottom);
            var F = Math.max(this.left, I.left);
            if (E >= G && H >= F) {
                return new Ext.lib.Region(G, H, E, F)
            } else {
                return null
            }
        },
        union: function(I) {
            var G = Math.min(this.top, I.top);
            var H = Math.max(this.right, I.right);
            var E = Math.max(this.bottom, I.bottom);
            var F = Math.min(this.left, I.left);
            return new Ext.lib.Region(G, H, E, F)
        },
        constrainTo: function(E) {
            this.top = this.top.constrain(E.top, E.bottom);
            this.bottom = this.bottom.constrain(E.top, E.bottom);
            this.left = this.left.constrain(E.left, E.right);
            this.right = this.right.constrain(E.left, E.right);
            return this
        },
        adjust: function(G, F, E, H) {
            this.top += G;
            this.left += F;
            this.right += H;
            this.bottom += E;
            return this
        }
    };
    Ext.lib.Region.getRegion = function(H) {
        var J = Ext.lib.Dom.getXY(H);
        var G = J[1];
        var I = J[0] + H.offsetWidth;
        var E = J[1] + H.offsetHeight;
        var F = J[0];
        return new Ext.lib.Region(G, I, E, F)
    };
    Ext.lib.Point = function(E, F) {
        if (Ext.isArray(E)) {
            F = E[1];
            E = E[0]
        }
        this.x = this.right = this.left = this[0] = E;
        this.y = this.top = this.bottom = this[1] = F
    };
    Ext.lib.Point.prototype = new Ext.lib.Region();
    Ext.lib.Anim = {
        scroll: function(H, F, I, J, E, G) {
            return this.run(H, F, I, J, E, G, Ext.lib.Scroll)
        },
        motion: function(H, F, I, J, E, G) {
            return this.run(H, F, I, J, E, G, Ext.lib.Motion)
        },
        color: function(H, F, I, J, E, G) {
            return this.run(H, F, I, J, E, G, Ext.lib.ColorAnim)
        },
        run: function(I, F, K, L, E, H, G) {
            G = G || Ext.lib.AnimBase;
            if (typeof L == "string") {
                L = Ext.lib.Easing[L]
            }
            var J = new G(I, F, K, L);
            J.animateX(function() {
                Ext.callback(E, H)
            });
            return J
        }
    };
    function C(E) {
        if (!B) {
            B = new Ext.Element.Flyweight()
        }
        B.dom = E;
        return B
    }
    if (Ext.isIE) {
        function A() {
            var E = Function.prototype;
            delete E.createSequence;
            delete E.defer;
            delete E.createDelegate;
            delete E.createCallback;
            delete E.createInterceptor;
            window.detachEvent("onunload", A)
        }
        window.attachEvent("onunload", A)
    }
    Ext.lib.AnimBase = function(F, E, G, H) {
        if (F) {
            this.init(F, E, G, H)
        }
    };
    Ext.lib.AnimBase.prototype = {
        toString: function() {
            var E = this.getEl();
            var F = E.id || E.tagName;
            return ("Anim " + F)
        },
        patterns: {
            noNegatives: /width|height|opacity|padding/i,
            offsetAttribute: /^((width|height)|(top|left))$/,
            defaultUnit: /width|height|top$|bottom$|left$|right$/i,
            offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i
        },
        doMethod: function(E, G, F) {
            return this.method(this.currentFrame, G, F - G, this.totalFrames)
        },
        setAttribute: function(E, G, F) {
            if (this.patterns.noNegatives.test(E)) {
                G = (G > 0) ? G: 0
            }
            Ext.fly(this.getEl(), "_anim").setStyle(E, G + F)
        },
        getAttribute: function(E) {
            var G = this.getEl();
            var I = C(G).getStyle(E);
            if (I !== "auto" && !this.patterns.offsetUnit.test(I)) {
                return parseFloat(I)
            }
            var F = this.patterns.offsetAttribute.exec(E) || [];
            var J = !!(F[3]);
            var H = !!(F[2]);
            if (H || (C(G).getStyle("position") == "absolute" && J)) {
                I = G["offset" + F[0].charAt(0).toUpperCase() + F[0].substr(1)]
            } else {
                I = 0
            }
            return I
        },
        getDefaultUnit: function(E) {
            if (this.patterns.defaultUnit.test(E)) {
                return "px"
            }
            return ""
        },
        animateX: function(G, E) {
            var F = function() {
                this.onComplete.removeListener(F);
                if (typeof G == "function") {
                    G.call(E || this, this)
                }
            };
            this.onComplete.addListener(F, this);
            this.animate()
        },
        setRuntimeAttribute: function(F) {
            var K;
            var G;
            var H = this.attributes;
            this.runtimeAttributes[F] = {};
            var J = function(L) {
                return (typeof L !== "undefined")
            };
            if (!J(H[F]["to"]) && !J(H[F]["by"])) {
                return false
            }
            K = (J(H[F]["from"])) ? H[F]["from"] : this.getAttribute(F);
            if (J(H[F]["to"])) {
                G = H[F]["to"]
            } else {
                if (J(H[F]["by"])) {
                    if (K.constructor == Array) {
                        G = [];
                        for (var I = 0, E = K.length; I < E; ++I) {
                            G[I] = K[I] + H[F]["by"][I]
                        }
                    } else {
                        G = K + H[F]["by"]
                    }
                }
            }
            this.runtimeAttributes[F].start = K;
            this.runtimeAttributes[F].end = G;
            this.runtimeAttributes[F].unit = (J(H[F].unit)) ? H[F]["unit"] : this.getDefaultUnit(F)
        },
        init: function(G, L, K, E) {
            var F = false;
            var H = null;
            var J = 0;
            G = Ext.getDom(G);
            this.attributes = L || {};
            this.duration = K || 1;
            this.method = E || Ext.lib.Easing.easeNone;
            this.useSeconds = true;
            this.currentFrame = 0;
            this.totalFrames = Ext.lib.AnimMgr.fps;
            this.getEl = function() {
                return G
            };
            this.isAnimated = function() {
                return F
            };
            this.getStartTime = function() {
                return H
            };
            this.runtimeAttributes = {};
            this.animate = function() {
                if (this.isAnimated()) {
                    return false
                }
                this.currentFrame = 0;
                this.totalFrames = (this.useSeconds) ? Math.ceil(Ext.lib.AnimMgr.fps * this.duration) : this.duration;
                Ext.lib.AnimMgr.registerElement(this)
            };
            this.stop = function(O) {
                if (O) {
                    this.currentFrame = this.totalFrames;
                    this._onTween.fire()
                }
                Ext.lib.AnimMgr.stop(this)
            };
            var N = function() {
                this.onStart.fire();
                this.runtimeAttributes = {};
                for (var O in this.attributes) {
                    this.setRuntimeAttribute(O)
                }
                F = true;
                J = 0;
                H = new Date()
            };
            var M = function() {
                var Q = {
                    duration: new Date() - this.getStartTime(),
                    currentFrame: this.currentFrame
                };
                Q.toString = function() {
                    return ("duration: " + Q.duration + ", currentFrame: " + Q.currentFrame)
                };
                this.onTween.fire(Q);
                var P = this.runtimeAttributes;
                for (var O in P) {
                    this.setAttribute(O, this.doMethod(O, P[O].start, P[O].end), P[O].unit)
                }
                J += 1
            };
            var I = function() {
                var O = (new Date() - H) / 1000;
                var P = {
                    duration: O,
                    frames: J,
                    fps: J / O
                };
                P.toString = function() {
                    return ("duration: " + P.duration + ", frames: " + P.frames + ", fps: " + P.fps)
                };
                F = false;
                J = 0;
                this.onComplete.fire(P)
            };
            this._onStart = new Ext.util.Event(this);
            this.onStart = new Ext.util.Event(this);
            this.onTween = new Ext.util.Event(this);
            this._onTween = new Ext.util.Event(this);
            this.onComplete = new Ext.util.Event(this);
            this._onComplete = new Ext.util.Event(this);
            this._onStart.addListener(N);
            this._onTween.addListener(M);
            this._onComplete.addListener(I)
        }
    };
    Ext.lib.AnimMgr = new
    function() {
        var G = null;
        var F = [];
        var E = 0;
        this.fps = 1000;
        this.delay = 1;
        this.registerElement = function(J) {
            F[F.length] = J;
            E += 1;
            J._onStart.fire();
            this.start()
        };
        this.unRegister = function(K, J) {
            K._onComplete.fire();
            J = J || I(K);
            if (J != -1) {
                F.splice(J, 1)
            }
            E -= 1;
            if (E <= 0) {
                this.stop()
            }
        };
        this.start = function() {
            if (G === null) {
                G = setInterval(this.run, this.delay)
            }
        };
        this.stop = function(L) {
            if (!L) {
                clearInterval(G);
                for (var K = 0, J = F.length; K < J; ++K) {
                    if (F[0].isAnimated()) {
                        this.unRegister(F[0], 0)
                    }
                }
                F = [];
                G = null;
                E = 0
            } else {
                this.unRegister(L)
            }
        };
        this.run = function() {
            for (var L = 0, J = F.length; L < J; ++L) {
                var K = F[L];
                if (!K || !K.isAnimated()) {
                    continue
                }
                if (K.currentFrame < K.totalFrames || K.totalFrames === null) {
                    K.currentFrame += 1;
                    if (K.useSeconds) {
                        H(K)
                    }
                    K._onTween.fire()
                } else {
                    Ext.lib.AnimMgr.stop(K, L)
                }
            }
        };
        var I = function(L) {
            for (var K = 0, J = F.length; K < J; ++K) {
                if (F[K] == L) {
                    return K
                }
            }
            return - 1
        };
        var H = function(K) {
            var N = K.totalFrames;
            var M = K.currentFrame;
            var L = (K.currentFrame * K.duration * 1000 / K.totalFrames);
            var J = (new Date() - K.getStartTime());
            var O = 0;
            if (J < K.duration * 1000) {
                O = Math.round((J / L - 1) * K.currentFrame)
            } else {
                O = N - (M + 1)
            }
            if (O > 0 && isFinite(O)) {
                if (K.currentFrame + O >= N) {
                    O = N - (M + 1)
                }
                K.currentFrame += O
            }
        }
    };
    Ext.lib.Bezier = new
    function() {
        this.getPosition = function(I, H) {
            var J = I.length;
            var G = [];
            for (var F = 0; F < J; ++F) {
                G[F] = [I[F][0], I[F][1]]
            }
            for (var E = 1; E < J; ++E) {
                for (F = 0; F < J - E; ++F) {
                    G[F][0] = (1 - H) * G[F][0] + H * G[parseInt(F + 1, 10)][0];
                    G[F][1] = (1 - H) * G[F][1] + H * G[parseInt(F + 1, 10)][1]
                }
            }
            return [G[0][0], G[0][1]]
        }
    };
    (function() {
        Ext.lib.ColorAnim = function(I, H, J, K) {
            Ext.lib.ColorAnim.superclass.constructor.call(this, I, H, J, K)
        };
        Ext.extend(Ext.lib.ColorAnim, Ext.lib.AnimBase);
        var F = Ext.lib;
        var G = F.ColorAnim.superclass;
        var E = F.ColorAnim.prototype;
        E.toString = function() {
            var H = this.getEl();
            var I = H.id || H.tagName;
            return ("ColorAnim " + I)
        };
        E.patterns.color = /color$/i;
        E.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;
        E.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
        E.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;
        E.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/;
        E.parseColor = function(H) {
            if (H.length == 3) {
                return H
            }
            var I = this.patterns.hex.exec(H);
            if (I && I.length == 4) {
                return [parseInt(I[1], 16), parseInt(I[2], 16), parseInt(I[3], 16)]
            }
            I = this.patterns.rgb.exec(H);
            if (I && I.length == 4) {
                return [parseInt(I[1], 10), parseInt(I[2], 10), parseInt(I[3], 10)]
            }
            I = this.patterns.hex3.exec(H);
            if (I && I.length == 4) {
                return [parseInt(I[1] + I[1], 16), parseInt(I[2] + I[2], 16), parseInt(I[3] + I[3], 16)]
            }
            return null
        };
        E.getAttribute = function(H) {
            var J = this.getEl();
            if (this.patterns.color.test(H)) {
                var K = C(J).getStyle(H);
                if (this.patterns.transparent.test(K)) {
                    var I = J.parentNode;
                    K = C(I).getStyle(H);
                    while (I && this.patterns.transparent.test(K)) {
                        I = I.parentNode;
                        K = C(I).getStyle(H);
                        if (I.tagName.toUpperCase() == "HTML") {
                            K = "#fff"
                        }
                    }
                }
            } else {
                K = G.getAttribute.call(this, H)
            }
            return K
        };
        E.doMethod = function(I, M, J) {
            var L;
            if (this.patterns.color.test(I)) {
                L = [];
                for (var K = 0, H = M.length; K < H; ++K) {
                    L[K] = G.doMethod.call(this, I, M[K], J[K])
                }
                L = "rgb(" + Math.floor(L[0]) + "," + Math.floor(L[1]) + "," + Math.floor(L[2]) + ")"
            } else {
                L = G.doMethod.call(this, I, M, J)
            }
            return L
        };
        E.setRuntimeAttribute = function(I) {
            G.setRuntimeAttribute.call(this, I);
            if (this.patterns.color.test(I)) {
                var K = this.attributes;
                var M = this.parseColor(this.runtimeAttributes[I].start);
                var J = this.parseColor(this.runtimeAttributes[I].end);
                if (typeof K[I]["to"] === "undefined" && typeof K[I]["by"] !== "undefined") {
                    J = this.parseColor(K[I].by);
                    for (var L = 0, H = M.length; L < H; ++L) {
                        J[L] = M[L] + J[L]
                    }
                }
                this.runtimeAttributes[I].start = M;
                this.runtimeAttributes[I].end = J
            }
        }
    })();
    Ext.lib.Easing = {
        easeNone: function(F, E, H, G) {
            return H * F / G + E
        },
        easeIn: function(F, E, H, G) {
            return H * (F /= G) * F + E
        },
        easeOut: function(F, E, H, G) {
            return - H * (F /= G) * (F - 2) + E
        },
        easeBoth: function(F, E, H, G) {
            if ((F /= G / 2) < 1) {
                return H / 2 * F * F + E
            }
            return - H / 2 * ((--F) * (F - 2) - 1) + E
        },
        easeInStrong: function(F, E, H, G) {
            return H * (F /= G) * F * F * F + E
        },
        easeOutStrong: function(F, E, H, G) {
            return - H * ((F = F / G - 1) * F * F * F - 1) + E
        },
        easeBothStrong: function(F, E, H, G) {
            if ((F /= G / 2) < 1) {
                return H / 2 * F * F * F * F + E
            }
            return - H / 2 * ((F -= 2) * F * F * F - 2) + E
        },
        elasticIn: function(G, E, K, J, F, I) {
            if (G == 0) {
                return E
            }
            if ((G /= J) == 1) {
                return E + K
            }
            if (!I) {
                I = J * 0.3
            }
            if (!F || F < Math.abs(K)) {
                F = K;
                var H = I / 4
            } else {
                var H = I / (2 * Math.PI) * Math.asin(K / F)
            }
            return - (F * Math.pow(2, 10 * (G -= 1)) * Math.sin((G * J - H) * (2 * Math.PI) / I)) + E
        },
        elasticOut: function(G, E, K, J, F, I) {
            if (G == 0) {
                return E
            }
            if ((G /= J) == 1) {
                return E + K
            }
            if (!I) {
                I = J * 0.3
            }
            if (!F || F < Math.abs(K)) {
                F = K;
                var H = I / 4
            } else {
                var H = I / (2 * Math.PI) * Math.asin(K / F)
            }
            return F * Math.pow(2, -10 * G) * Math.sin((G * J - H) * (2 * Math.PI) / I) + K + E
        },
        elasticBoth: function(G, E, K, J, F, I) {
            if (G == 0) {
                return E
            }
            if ((G /= J / 2) == 2) {
                return E + K
            }
            if (!I) {
                I = J * (0.3 * 1.5)
            }
            if (!F || F < Math.abs(K)) {
                F = K;
                var H = I / 4
            } else {
                var H = I / (2 * Math.PI) * Math.asin(K / F)
            }
            if (G < 1) {
                return - 0.5 * (F * Math.pow(2, 10 * (G -= 1)) * Math.sin((G * J - H) * (2 * Math.PI) / I)) + E
            }
            return F * Math.pow(2, -10 * (G -= 1)) * Math.sin((G * J - H) * (2 * Math.PI) / I) * 0.5 + K + E
        },
        backIn: function(F, E, I, H, G) {
            if (typeof G == "undefined") {
                G = 1.70158
            }
            return I * (F /= H) * F * ((G + 1) * F - G) + E
        },
        backOut: function(F, E, I, H, G) {
            if (typeof G == "undefined") {
                G = 1.70158
            }
            return I * ((F = F / H - 1) * F * ((G + 1) * F + G) + 1) + E
        },
        backBoth: function(F, E, I, H, G) {
            if (typeof G == "undefined") {
                G = 1.70158
            }
            if ((F /= H / 2) < 1) {
                return I / 2 * (F * F * (((G *= (1.525)) + 1) * F - G)) + E
            }
            return I / 2 * ((F -= 2) * F * (((G *= (1.525)) + 1) * F + G) + 2) + E
        },
        bounceIn: function(F, E, H, G) {
            return H - Ext.lib.Easing.bounceOut(G - F, 0, H, G) + E
        },
        bounceOut: function(F, E, H, G) {
            if ((F /= G) < (1 / 2.75)) {
                return H * (7.5625 * F * F) + E
            } else {
                if (F < (2 / 2.75)) {
                    return H * (7.5625 * (F -= (1.5 / 2.75)) * F + 0.75) + E
                } else {
                    if (F < (2.5 / 2.75)) {
                        return H * (7.5625 * (F -= (2.25 / 2.75)) * F + 0.9375) + E
                    }
                }
            }
            return H * (7.5625 * (F -= (2.625 / 2.75)) * F + 0.984375) + E
        },
        bounceBoth: function(F, E, H, G) {
            if (F < G / 2) {
                return Ext.lib.Easing.bounceIn(F * 2, 0, H, G) * 0.5 + E
            }
            return Ext.lib.Easing.bounceOut(F * 2 - G, 0, H, G) * 0.5 + H * 0.5 + E
        }
    };
    (function() {
        Ext.lib.Motion = function(K, J, L, M) {
            if (K) {
                Ext.lib.Motion.superclass.constructor.call(this, K, J, L, M)
            }
        };
        Ext.extend(Ext.lib.Motion, Ext.lib.ColorAnim);
        var H = Ext.lib;
        var I = H.Motion.superclass;
        var F = H.Motion.prototype;
        F.toString = function() {
            var J = this.getEl();
            var K = J.id || J.tagName;
            return ("Motion " + K)
        };
        F.patterns.points = /^points$/i;
        F.setAttribute = function(J, L, K) {
            if (this.patterns.points.test(J)) {
                K = K || "px";
                I.setAttribute.call(this, "left", L[0], K);
                I.setAttribute.call(this, "top", L[1], K)
            } else {
                I.setAttribute.call(this, J, L, K)
            }
        };
        F.getAttribute = function(J) {
            if (this.patterns.points.test(J)) {
                var K = [I.getAttribute.call(this, "left"), I.getAttribute.call(this, "top")]
            } else {
                K = I.getAttribute.call(this, J)
            }
            return K
        };
        F.doMethod = function(J, N, K) {
            var M = null;
            if (this.patterns.points.test(J)) {
                var L = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;
                M = H.Bezier.getPosition(this.runtimeAttributes[J], L)
            } else {
                M = I.doMethod.call(this, J, N, K)
            }
            return M
        };
        F.setRuntimeAttribute = function(S) {
            if (this.patterns.points.test(S)) {
                var K = this.getEl();
                var M = this.attributes;
                var J;
                var O = M["points"]["control"] || [];
                var L;
                var P, R;
                if (O.length > 0 && !Ext.isArray(O[0])) {
                    O = [O]
                } else {
                    var N = [];
                    for (P = 0, R = O.length; P < R; ++P) {
                        N[P] = O[P]
                    }
                    O = N
                }
                Ext.fly(K, "_anim").position();
                if (G(M["points"]["from"])) {
                    Ext.lib.Dom.setXY(K, M["points"]["from"])
                } else {
                    Ext.lib.Dom.setXY(K, Ext.lib.Dom.getXY(K))
                }
                J = this.getAttribute("points");
                if (G(M["points"]["to"])) {
                    L = E.call(this, M["points"]["to"], J);
                    var Q = Ext.lib.Dom.getXY(this.getEl());
                    for (P = 0, R = O.length; P < R; ++P) {
                        O[P] = E.call(this, O[P], J)
                    }
                } else {
                    if (G(M["points"]["by"])) {
                        L = [J[0] + M["points"]["by"][0], J[1] + M["points"]["by"][1]];
                        for (P = 0, R = O.length; P < R; ++P) {
                            O[P] = [J[0] + O[P][0], J[1] + O[P][1]]
                        }
                    }
                }
                this.runtimeAttributes[S] = [J];
                if (O.length > 0) {
                    this.runtimeAttributes[S] = this.runtimeAttributes[S].concat(O)
                }
                this.runtimeAttributes[S][this.runtimeAttributes[S].length] = L
            } else {
                I.setRuntimeAttribute.call(this, S)
            }
        };
        var E = function(J, L) {
            var K = Ext.lib.Dom.getXY(this.getEl());
            J = [J[0] - K[0] + L[0], J[1] - K[1] + L[1]];
            return J
        };
        var G = function(J) {
            return (typeof J !== "undefined")
        }
    })();
    (function() {
        Ext.lib.Scroll = function(I, H, J, K) {
            if (I) {
                Ext.lib.Scroll.superclass.constructor.call(this, I, H, J, K)
            }
        };
        Ext.extend(Ext.lib.Scroll, Ext.lib.ColorAnim);
        var F = Ext.lib;
        var G = F.Scroll.superclass;
        var E = F.Scroll.prototype;
        E.toString = function() {
            var H = this.getEl();
            var I = H.id || H.tagName;
            return ("Scroll " + I)
        };
        E.doMethod = function(H, K, I) {
            var J = null;
            if (H == "scroll") {
                J = [this.method(this.currentFrame, K[0], I[0] - K[0], this.totalFrames), this.method(this.currentFrame, K[1], I[1] - K[1], this.totalFrames)]
            } else {
                J = G.doMethod.call(this, H, K, I)
            }
            return J
        };
        E.getAttribute = function(H) {
            var J = null;
            var I = this.getEl();
            if (H == "scroll") {
                J = [I.scrollLeft, I.scrollTop]
            } else {
                J = G.getAttribute.call(this, H)
            }
            return J
        };
        E.setAttribute = function(H, K, J) {
            var I = this.getEl();
            if (H == "scroll") {
                I.scrollLeft = K[0];
                I.scrollTop = K[1]
            } else {
                G.setAttribute.call(this, H, K, J)
            }
        }
    })()
})();
Ext.DomHelper = function() {
    var L = null;
    var F = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;
    var B = /^table|tbody|tr|td$/i;
    var A = function(T) {
        if (typeof T == "string") {
            return T
        }
        var O = "";
        if (Ext.isArray(T)) {
            for (var R = 0, P = T.length; R < P; R++) {
                O += A(T[R])
            }
            return O
        }
        if (!T.tag) {
            T.tag = "div"
        }
        O += "<" + T.tag;
        for (var N in T) {
            if (N == "tag" || N == "children" || N == "cn" || N == "html" || typeof T[N] == "function") {
                continue
            }
            if (N == "style") {
                var S = T["style"];
                if (typeof S == "function") {
                    S = S.call()
                }
                if (typeof S == "string") {
                    O += " style=\"" + S + "\""
                } else {
                    if (typeof S == "object") {
                        O += " style=\"";
                        for (var Q in S) {
                            if (typeof S[Q] != "function") {
                                O += Q + ":" + S[Q] + ";"
                            }
                        }
                        O += "\""
                    }
                }
            } else {
                if (N == "cls") {
                    O += " class=\"" + T["cls"] + "\""
                } else {
                    if (N == "htmlFor") {
                        O += " for=\"" + T["htmlFor"] + "\""
                    } else {
                        O += " " + N + "=\"" + T[N] + "\""
                    }
                }
            }
        }
        if (F.test(T.tag)) {
            O += "/>"
        } else {
            O += ">";
            var U = T.children || T.cn;
            if (U) {
                O += A(U)
            } else {
                if (T.html) {
                    O += T.html
                }
            }
            O += "</" + T.tag + ">"
        }
        return O
    };
    var M = function(T, O) {
        var S;
        if (Ext.isArray(T)) {
            S = document.createDocumentFragment();
            for (var R = 0, P = T.length; R < P; R++) {
                M(T[R], S)
            }
        } else {
            if (typeof T == "string") {
                S = document.createTextNode(T)
            } else {
                S = document.createElement(T.tag || "div");
                var Q = !!S.setAttribute;
                for (var N in T) {
                    if (N == "tag" || N == "children" || N == "cn" || N == "html" || N == "style" || typeof T[N] == "function") {
                        continue
                    }
                    if (N == "cls") {
                        S.className = T["cls"]
                    } else {
                        if (Q) {
                            S.setAttribute(N, T[N])
                        } else {
                            S[N] = T[N]
                        }
                    }
                }
                Ext.DomHelper.applyStyles(S, T.style);
                var U = T.children || T.cn;
                if (U) {
                    M(U, S)
                } else {
                    if (T.html) {
                        S.innerHTML = T.html
                    }
                }
            }
        }
        if (O) {
            O.appendChild(S)
        }
        return S
    };
    var I = function(S, Q, P, R) {
        L.innerHTML = [Q, P, R].join("");
        var N = -1,
        O = L;
        while (++N < S) {
            O = O.firstChild
        }
        return O
    };
    var J = "<table>",
    E = "</table>",
    C = J + "<tbody>",
    K = "</tbody>" + E,
    H = C + "<tr>",
    D = "</tr>" + K;
    var G = function(N, O, Q, P) {
        if (!L) {
            L = document.createElement("div")
        }
        var R;
        var S = null;
        if (N == "td") {
            if (O == "afterbegin" || O == "beforeend") {
                return
            }
            if (O == "beforebegin") {
                S = Q;
                Q = Q.parentNode
            } else {
                S = Q.nextSibling;
                Q = Q.parentNode
            }
            R = I(4, H, P, D)
        } else {
            if (N == "tr") {
                if (O == "beforebegin") {
                    S = Q;
                    Q = Q.parentNode;
                    R = I(3, C, P, K)
                } else {
                    if (O == "afterend") {
                        S = Q.nextSibling;
                        Q = Q.parentNode;
                        R = I(3, C, P, K)
                    } else {
                        if (O == "afterbegin") {
                            S = Q.firstChild
                        }
                        R = I(4, H, P, D)
                    }
                }
            } else {
                if (N == "tbody") {
                    if (O == "beforebegin") {
                        S = Q;
                        Q = Q.parentNode;
                        R = I(2, J, P, E)
                    } else {
                        if (O == "afterend") {
                            S = Q.nextSibling;
                            Q = Q.parentNode;
                            R = I(2, J, P, E)
                        } else {
                            if (O == "afterbegin") {
                                S = Q.firstChild
                            }
                            R = I(3, C, P, K)
                        }
                    }
                } else {
                    if (O == "beforebegin" || O == "afterend") {
                        return
                    }
                    if (O == "afterbegin") {
                        S = Q.firstChild
                    }
                    R = I(2, J, P, E)
                }
            }
        }
        Q.insertBefore(R, S);
        return R
    };
    return {
        useDom: false,
        markup: function(N) {
            return A(N)
        },
        applyStyles: function(P, Q) {
            if (Q) {
                P = Ext.fly(P);
                if (typeof Q == "string") {
                    var O = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;
                    var R;
                    while ((R = O.exec(Q)) != null) {
                        P.setStyle(R[1], R[2])
                    }
                } else {
                    if (typeof Q == "object") {
                        for (var N in Q) {
                            P.setStyle(N, Q[N])
                        }
                    } else {
                        if (typeof Q == "function") {
                            Ext.DomHelper.applyStyles(P, Q.call())
                        }
                    }
                }
            }
        },
        insertHtml: function(P, R, Q) {
            P = P.toLowerCase();
            if (R.insertAdjacentHTML) {
                if (B.test(R.tagName)) {
                    var O;
                    if (O = G(R.tagName.toLowerCase(), P, R, Q)) {
                        return O
                    }
                }
                switch (P) {
                case "beforebegin":
                    R.insertAdjacentHTML("BeforeBegin", Q);
                    return R.previousSibling;
                case "afterbegin":
                    R.insertAdjacentHTML("AfterBegin", Q);
                    return R.firstChild;
                case "beforeend":
                    R.insertAdjacentHTML("BeforeEnd", Q);
                    return R.lastChild;
                case "afterend":
                    R.insertAdjacentHTML("AfterEnd", Q);
                    return R.nextSibling
                }
                throw "Illegal insertion point -> \"" + P + "\""
            }
            var N = R.ownerDocument.createRange();
            var S;
            switch (P) {
            case "beforebegin":
                N.setStartBefore(R);
                S = N.createContextualFragment(Q);
                R.parentNode.insertBefore(S, R);
                return R.previousSibling;
            case "afterbegin":
                if (R.firstChild) {
                    N.setStartBefore(R.firstChild);
                    S = N.createContextualFragment(Q);
                    R.insertBefore(S, R.firstChild);
                    return R.firstChild
                } else {
                    R.innerHTML = Q;
                    return R.firstChild
                }
            case "beforeend":
                if (R.lastChild) {
                    N.setStartAfter(R.lastChild);
                    S = N.createContextualFragment(Q);
                    R.appendChild(S);
                    return R.lastChild
                } else {
                    R.innerHTML = Q;
                    return R.lastChild
                }
            case "afterend":
                N.setStartAfter(R);
                S = N.createContextualFragment(Q);
                R.parentNode.insertBefore(S, R.nextSibling);
                return R.nextSibling
            }
            throw "Illegal insertion point -> \"" + P + "\""
        },
        insertBefore: function(N, P, O) {
            return this.doInsert(N, P, O, "beforeBegin")
        },
        insertAfter: function(N, P, O) {
            return this.doInsert(N, P, O, "afterEnd", "nextSibling")
        },
        insertFirst: function(N, P, O) {
            return this.doInsert(N, P, O, "afterBegin", "firstChild")
        },
        doInsert: function(Q, S, R, T, P) {
            Q = Ext.getDom(Q);
            var O;
            if (this.useDom) {
                O = M(S, null);
                (P === "firstChild" ? Q: Q.parentNode).insertBefore(O, P ? Q[P] : Q)
            } else {
                var N = A(S);
                O = this.insertHtml(T, Q, N)
            }
            return R ? Ext.get(O, true) : O
        },
        append: function(P, R, Q) {
            P = Ext.getDom(P);
            var O;
            if (this.useDom) {
                O = M(R, null);
                P.appendChild(O)
            } else {
                var N = A(R);
                O = this.insertHtml("beforeEnd", P, N)
            }
            return Q ? Ext.get(O, true) : O
        },
        overwrite: function(N, P, O) {
            N = Ext.getDom(N);
            N.innerHTML = A(P);
            return O ? Ext.get(N.firstChild, true) : N.firstChild
        },
        createTemplate: function(O) {
            var N = A(O);
            return new Ext.Template(N)
        }
    }
} ();
Ext.Template = function(E) {
    var B = arguments;
    if (Ext.isArray(E)) {
        E = E.join("")
    } else {
        if (B.length > 1) {
            var C = [];
            for (var D = 0, A = B.length; D < A; D++) {
                if (typeof B[D] == "object") {
                    Ext.apply(this, B[D])
                } else {
                    C[C.length] = B[D]
                }
            }
            E = C.join("")
        }
    }
    this.html = E;
    if (this.compiled) {
        this.compile()
    }
};
Ext.Template.prototype = {
    applyTemplate: function(B) {
        if (this.compiled) {
            return this.compiled(B)
        }
        var A = this.disableFormats !== true;
        var E = Ext.util.Format,
        C = this;
        var D = function(G, I, L, H) {
            if (L && A) {
                if (L.substr(0, 5) == "this.") {
                    return C.call(L.substr(5), B[I], B)
                } else {
                    if (H) {
                        var K = /^\s*['"](.*)["']\s*$/;
                        H = H.split(",");
                        for (var J = 0, F = H.length; J < F; J++) {
                            H[J] = H[J].replace(K, "$1")
                        }
                        H = [B[I]].concat(H)
                    } else {
                        H = [B[I]]
                    }
                    return E[L].apply(E, H)
                }
            } else {
                return B[I] !== undefined ? B[I] : ""
            }
        };
        return this.html.replace(this.re, D)
    },
    set: function(A, B) {
        this.html = A;
        this.compiled = null;
        if (B) {
            this.compile()
        }
        return this
    },
    disableFormats: false,
    re: /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
    compile: function() {
        var fm = Ext.util.Format;
        var useF = this.disableFormats !== true;
        var sep = Ext.isGecko ? "+": ",";
        var fn = function(m, name, format, args) {
            if (format && useF) {
                args = args ? "," + args: "";
                if (format.substr(0, 5) != "this.") {
                    format = "fm." + format + "("
                } else {
                    format = "this.call(\"" + format.substr(5) + "\", ";
                    args = ", values"
                }
            } else {
                args = "";
                format = "(values['" + name + "'] == undefined ? '' : "
            }
            return "'" + sep + format + "values['" + name + "']" + args + ")" + sep + "'"
        };
        var body;
        if (Ext.isGecko) {
            body = "this.compiled = function(values){ return '" + this.html.replace(/\\/g, "\\\\").replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn) + "';};"
        } else {
            body = ["this.compiled = function(values){ return ['"];
            body.push(this.html.replace(/\\/g, "\\\\").replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn));
            body.push("'].join('');};");
            body = body.join("")
        }
        eval(body);
        return this
    },
    call: function(C, B, A) {
        return this[C](B, A)
    },
    insertFirst: function(B, A, C) {
        return this.doInsert("afterBegin", B, A, C)
    },
    insertBefore: function(B, A, C) {
        return this.doInsert("beforeBegin", B, A, C)
    },
    insertAfter: function(B, A, C) {
        return this.doInsert("afterEnd", B, A, C)
    },
    append: function(B, A, C) {
        return this.doInsert("beforeEnd", B, A, C)
    },
    doInsert: function(C, E, B, A) {
        E = Ext.getDom(E);
        var D = Ext.DomHelper.insertHtml(C, E, this.applyTemplate(B));
        return A ? Ext.get(D, true) : D
    },
    overwrite: function(B, A, C) {
        B = Ext.getDom(B);
        B.innerHTML = this.applyTemplate(A);
        return C ? Ext.get(B.firstChild, true) : B.firstChild
    }
};
Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
Ext.DomHelper.Template = Ext.Template;
Ext.Template.from = function(B, A) {
    B = Ext.getDom(B);
    return new Ext.Template(B.value || B.innerHTML, A || "")
};
Ext.DomQuery = function() {
    var cache = {},
    simpleCache = {},
    valueCache = {};
    var nonSpace = /\S/;
    var trimRe = /^\s+|\s+$/g;
    var tplRe = /\{(\d+)\}/g;
    var modeRe = /^(\s?[\/>+~]\s?|\s|$)/;
    var tagTokenRe = /^(#)?([\w-\*]+)/;
    var nthRe = /(\d*)n\+?(\d*)/,
    nthRe2 = /\D/;
    function child(p, index) {
        var i = 0;
        var n = p.firstChild;
        while (n) {
            if (n.nodeType == 1) {
                if (++i == index) {
                    return n
                }
            }
            n = n.nextSibling
        }
        return null
    }
    function next(n) {
        while ((n = n.nextSibling) && n.nodeType != 1) {}
        return n
    }
    function prev(n) {
        while ((n = n.previousSibling) && n.nodeType != 1) {}
        return n
    }
    function children(d) {
        var n = d.firstChild,
        ni = -1;
        while (n) {
            var nx = n.nextSibling;
            if (n.nodeType == 3 && !nonSpace.test(n.nodeValue)) {
                d.removeChild(n)
            } else {
                n.nodeIndex = ++ni
            }
            n = nx
        }
        return this
    }
    function byClassName(c, a, v) {
        if (!v) {
            return c
        }
        var r = [],
        ri = -1,
        cn;
        for (var i = 0, ci; ci = c[i]; i++) {
            if ((" " + ci.className + " ").indexOf(v) != -1) {
                r[++ri] = ci
            }
        }
        return r
    }
    function attrValue(n, attr) {
        if (!n.tagName && typeof n.length != "undefined") {
            n = n[0]
        }
        if (!n) {
            return null
        }
        if (attr == "for") {
            return n.htmlFor
        }
        if (attr == "class" || attr == "className") {
            return n.className
        }
        return n.getAttribute(attr) || n[attr]
    }
    function getNodes(ns, mode, tagName) {
        var result = [],
        ri = -1,
        cs;
        if (!ns) {
            return result
        }
        tagName = tagName || "*";
        if (typeof ns.getElementsByTagName != "undefined") {
            ns = [ns]
        }
        if (!mode) {
            for (var i = 0, ni; ni = ns[i]; i++) {
                cs = ni.getElementsByTagName(tagName);
                for (var j = 0, ci; ci = cs[j]; j++) {
                    result[++ri] = ci
                }
            }
        } else {
            if (mode == "/" || mode == ">") {
                var utag = tagName.toUpperCase();
                for (var i = 0, ni, cn; ni = ns[i]; i++) {
                    cn = ni.children || ni.childNodes;
                    for (var j = 0, cj; cj = cn[j]; j++) {
                        if (cj.nodeName == utag || cj.nodeName == tagName || tagName == "*") {
                            result[++ri] = cj
                        }
                    }
                }
            } else {
                if (mode == "+") {
                    var utag = tagName.toUpperCase();
                    for (var i = 0, n; n = ns[i]; i++) {
                        while ((n = n.nextSibling) && n.nodeType != 1) {}
                        if (n && (n.nodeName == utag || n.nodeName == tagName || tagName == "*")) {
                            result[++ri] = n
                        }
                    }
                } else {
                    if (mode == "~") {
                        for (var i = 0, n; n = ns[i]; i++) {
                            while ((n = n.nextSibling) && (n.nodeType != 1 || (tagName == "*" || n.tagName.toLowerCase() != tagName))) {}
                            if (n) {
                                result[++ri] = n
                            }
                        }
                    }
                }
            }
        }
        return result
    }
    function concat(a, b) {
        if (b.slice) {
            return a.concat(b)
        }
        for (var i = 0, l = b.length; i < l; i++) {
            a[a.length] = b[i]
        }
        return a
    }
    function byTag(cs, tagName) {
        if (cs.tagName || cs == document) {
            cs = [cs]
        }
        if (!tagName) {
            return cs
        }
        var r = [],
        ri = -1;
        tagName = tagName.toLowerCase();
        for (var i = 0, ci; ci = cs[i]; i++) {
            if (ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName) {
                r[++ri] = ci
            }
        }
        return r
    }
    function byId(cs, attr, id) {
        if (cs.tagName || cs == document) {
            cs = [cs]
        }
        if (!id) {
            return cs
        }
        var r = [],
        ri = -1;
        for (var i = 0, ci; ci = cs[i]; i++) {
            if (ci && ci.id == id) {
                r[++ri] = ci;
                return r
            }
        }
        return r
    }
    function byAttribute(cs, attr, value, op, custom) {
        var r = [],
        ri = -1,
        st = custom == "{";
        var f = Ext.DomQuery.operators[op];
        for (var i = 0, ci; ci = cs[i]; i++) {
            var a;
            if (st) {
                a = Ext.DomQuery.getStyle(ci, attr)
            } else {
                if (attr == "class" || attr == "className") {
                    a = ci.className
                } else {
                    if (attr == "for") {
                        a = ci.htmlFor
                    } else {
                        if (attr == "href") {
                            a = ci.getAttribute("href", 2)
                        } else {
                            a = ci.getAttribute(attr)
                        }
                    }
                }
            }
            if ((f && f(a, value)) || (!f && a)) {
                r[++ri] = ci
            }
        }
        return r
    }
    function byPseudo(cs, name, value) {
        return Ext.DomQuery.pseudos[name](cs, value)
    }
    var isIE = window.ActiveXObject ? true: false;
    eval("var batch = 30803;");
    var key = 30803;
    function nodupIEXml(cs) {
        var d = ++key;
        cs[0].setAttribute("_nodup", d);
        var r = [cs[0]];
        for (var i = 1, len = cs.length; i < len; i++) {
            var c = cs[i];
            if (!c.getAttribute("_nodup") != d) {
                c.setAttribute("_nodup", d);
                r[r.length] = c
            }
        }
        for (var i = 0, len = cs.length; i < len; i++) {
            cs[i].removeAttribute("_nodup")
        }
        return r
    }
    function nodup(cs) {
        if (!cs) {
            return []
        }
        var len = cs.length,
        c, i, r = cs,
        cj, ri = -1;
        if (!len || typeof cs.nodeType != "undefined" || len == 1) {
            return cs
        }
        if (isIE && typeof cs[0].selectSingleNode != "undefined") {
            return nodupIEXml(cs)
        }
        var d = ++key;
        cs[0]._nodup = d;
        for (i = 1; c = cs[i]; i++) {
            if (c._nodup != d) {
                c._nodup = d
            } else {
                r = [];
                for (var j = 0; j < i; j++) {
                    r[++ri] = cs[j]
                }
                for (j = i + 1; cj = cs[j]; j++) {
                    if (cj._nodup != d) {
                        cj._nodup = d;
                        r[++ri] = cj
                    }
                }
                return r
            }
        }
        return r
    }
    function quickDiffIEXml(c1, c2) {
        var d = ++key;
        for (var i = 0, len = c1.length; i < len; i++) {
            c1[i].setAttribute("_qdiff", d)
        }
        var r = [];
        for (var i = 0, len = c2.length; i < len; i++) {
            if (c2[i].getAttribute("_qdiff") != d) {
                r[r.length] = c2[i]
            }
        }
        for (var i = 0, len = c1.length; i < len; i++) {
            c1[i].removeAttribute("_qdiff")
        }
        return r
    }
    function quickDiff(c1, c2) {
        var len1 = c1.length;
        if (!len1) {
            return c2
        }
        if (isIE && c1[0].selectSingleNode) {
            return quickDiffIEXml(c1, c2)
        }
        var d = ++key;
        for (var i = 0; i < len1; i++) {
            c1[i]._qdiff = d
        }
        var r = [];
        for (var i = 0, len = c2.length; i < len; i++) {
            if (c2[i]._qdiff != d) {
                r[r.length] = c2[i]
            }
        }
        return r
    }
    function quickId(ns, mode, root, id) {
        if (ns == root) {
            var d = root.ownerDocument || root;
            return d.getElementById(id)
        }
        ns = getNodes(ns, mode, "*");
        return byId(ns, null, id)
    }
    return {
        getStyle: function(el, name) {
            return Ext.fly(el).getStyle(name)
        },
        compile: function(path, type) {
            type = type || "select";
            var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"];
            var q = path,
            mode, lq;
            var tk = Ext.DomQuery.matchers;
            var tklen = tk.length;
            var mm;
            var lmode = q.match(modeRe);
            if (lmode && lmode[1]) {
                fn[fn.length] = "mode=\"" + lmode[1].replace(trimRe, "") + "\";";
                q = q.replace(lmode[1], "")
            }
            while (path.substr(0, 1) == "/") {
                path = path.substr(1)
            }
            while (q && lq != q) {
                lq = q;
                var tm = q.match(tagTokenRe);
                if (type == "select") {
                    if (tm) {
                        if (tm[1] == "#") {
                            fn[fn.length] = "n = quickId(n, mode, root, \"" + tm[2] + "\");"
                        } else {
                            fn[fn.length] = "n = getNodes(n, mode, \"" + tm[2] + "\");"
                        }
                        q = q.replace(tm[0], "")
                    } else {
                        if (q.substr(0, 1) != "@") {
                            fn[fn.length] = "n = getNodes(n, mode, \"*\");"
                        }
                    }
                } else {
                    if (tm) {
                        if (tm[1] == "#") {
                            fn[fn.length] = "n = byId(n, null, \"" + tm[2] + "\");"
                        } else {
                            fn[fn.length] = "n = byTag(n, \"" + tm[2] + "\");"
                        }
                        q = q.replace(tm[0], "")
                    }
                }
                while (! (mm = q.match(modeRe))) {
                    var matched = false;
                    for (var j = 0; j < tklen; j++) {
                        var t = tk[j];
                        var m = q.match(t.re);
                        if (m) {
                            fn[fn.length] = t.select.replace(tplRe,
                            function(x, i) {
                                return m[i]
                            });
                            q = q.replace(m[0], "");
                            matched = true;
                            break
                        }
                    }
                    if (!matched) {
                        throw "Error parsing selector, parsing failed at \"" + q + "\""
                    }
                }
                if (mm[1]) {
                    fn[fn.length] = "mode=\"" + mm[1].replace(trimRe, "") + "\";";
                    q = q.replace(mm[1], "")
                }
            }
            fn[fn.length] = "return nodup(n);\n}";
            eval(fn.join(""));
            return f
        },
        select: function(path, root, type) {
            if (!root || root == document) {
                root = document
            }
            if (typeof root == "string") {
                root = document.getElementById(root)
            }
            var paths = path.split(",");
            var results = [];
            for (var i = 0, len = paths.length; i < len; i++) {
                var p = paths[i].replace(trimRe, "");
                if (!cache[p]) {
                    cache[p] = Ext.DomQuery.compile(p);
                    if (!cache[p]) {
                        throw p + " is not a valid selector"
                    }
                }
                var result = cache[p](root);
                if (result && result != document) {
                    results = results.concat(result)
                }
            }
            if (paths.length > 1) {
                return nodup(results)
            }
            return results
        },
        selectNode: function(path, root) {
            return Ext.DomQuery.select(path, root)[0]
        },
        selectValue: function(path, root, defaultValue) {
            path = path.replace(trimRe, "");
            if (!valueCache[path]) {
                valueCache[path] = Ext.DomQuery.compile(path, "select")
            }
            var n = valueCache[path](root);
            n = n[0] ? n[0] : n;
            var v = (n && n.firstChild ? n.firstChild.nodeValue: null);
            return ((v === null || v === undefined || v === "") ? defaultValue: v)
        },
        selectNumber: function(path, root, defaultValue) {
            var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
            return parseFloat(v)
        },
        is: function(el, ss) {
            if (typeof el == "string") {
                el = document.getElementById(el)
            }
            var isArray = Ext.isArray(el);
            var result = Ext.DomQuery.filter(isArray ? el: [el], ss);
            return isArray ? (result.length == el.length) : (result.length > 0)
        },
        filter: function(els, ss, nonMatches) {
            ss = ss.replace(trimRe, "");
            if (!simpleCache[ss]) {
                simpleCache[ss] = Ext.DomQuery.compile(ss, "simple")
            }
            var result = simpleCache[ss](els);
            return nonMatches ? quickDiff(result, els) : result
        },
        matchers: [{
            re: /^\.([\w-]+)/,
            select: "n = byClassName(n, null, \" {1} \");"
        },
        {
            re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
            select: "n = byPseudo(n, \"{1}\", \"{2}\");"
        },
        {
            re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
            select: "n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"
        },
        {
            re: /^#([\w-]+)/,
            select: "n = byId(n, null, \"{1}\");"
        },
        {
            re: /^@([\w-]+)/,
            select: "return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"
        }],
        operators: {
            "=": function(a, v) {
                return a == v
            },
            "!=": function(a, v) {
                return a != v
            },
            "^=": function(a, v) {
                return a && a.substr(0, v.length) == v
            },
            "$=": function(a, v) {
                return a && a.substr(a.length - v.length) == v
            },
            "*=": function(a, v) {
                return a && a.indexOf(v) !== -1
            },
            "%=": function(a, v) {
                return (a % v) == 0
            },
            "|=": function(a, v) {
                return a && (a == v || a.substr(0, v.length + 1) == v + "-")
            },
            "~=": function(a, v) {
                return a && (" " + a + " ").indexOf(" " + v + " ") != -1
            }
        },
        pseudos: {
            "first-child": function(c) {
                var r = [],
                ri = -1,
                n;
                for (var i = 0, ci; ci = n = c[i]; i++) {
                    while ((n = n.previousSibling) && n.nodeType != 1) {}
                    if (!n) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "last-child": function(c) {
                var r = [],
                ri = -1,
                n;
                for (var i = 0, ci; ci = n = c[i]; i++) {
                    while ((n = n.nextSibling) && n.nodeType != 1) {}
                    if (!n) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "nth-child": function(c, a) {
                var r = [],
                ri = -1;
                var m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a);
                var f = (m[1] || 1) - 0,
                l = m[2] - 0;
                for (var i = 0, n; n = c[i]; i++) {
                    var pn = n.parentNode;
                    if (batch != pn._batch) {
                        var j = 0;
                        for (var cn = pn.firstChild; cn; cn = cn.nextSibling) {
                            if (cn.nodeType == 1) {
                                cn.nodeIndex = ++j
                            }
                        }
                        pn._batch = batch
                    }
                    if (f == 1) {
                        if (l == 0 || n.nodeIndex == l) {
                            r[++ri] = n
                        }
                    } else {
                        if ((n.nodeIndex + l) % f == 0) {
                            r[++ri] = n
                        }
                    }
                }
                return r
            },
            "only-child": function(c) {
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    if (!prev(ci) && !next(ci)) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "empty": function(c) {
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    var cns = ci.childNodes,
                    j = 0,
                    cn, empty = true;
                    while (cn = cns[j]) {++j;
                        if (cn.nodeType == 1 || cn.nodeType == 3) {
                            empty = false;
                            break
                        }
                    }
                    if (empty) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "contains": function(c, v) {
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    if ((ci.textContent || ci.innerText || "").indexOf(v) != -1) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "nodeValue": function(c, v) {
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    if (ci.firstChild && ci.firstChild.nodeValue == v) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "checked": function(c) {
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    if (ci.checked == true) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "not": function(c, ss) {
                return Ext.DomQuery.filter(c, ss, true)
            },
            "any": function(c, selectors) {
                var ss = selectors.split("|");
                var r = [],
                ri = -1,
                s;
                for (var i = 0, ci; ci = c[i]; i++) {
                    for (var j = 0; s = ss[j]; j++) {
                        if (Ext.DomQuery.is(ci, s)) {
                            r[++ri] = ci;
                            break
                        }
                    }
                }
                return r
            },
            "odd": function(c) {
                return this["nth-child"](c, "odd")
            },
            "even": function(c) {
                return this["nth-child"](c, "even")
            },
            "nth": function(c, a) {
                return c[a - 1] || []
            },
            "first": function(c) {
                return c[0] || []
            },
            "last": function(c) {
                return c[c.length - 1] || []
            },
            "has": function(c, ss) {
                var s = Ext.DomQuery.select;
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    if (s(ss, ci).length > 0) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "next": function(c, ss) {
                var is = Ext.DomQuery.is;
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    var n = next(ci);
                    if (n && is(n, ss)) {
                        r[++ri] = ci
                    }
                }
                return r
            },
            "prev": function(c, ss) {
                var is = Ext.DomQuery.is;
                var r = [],
                ri = -1;
                for (var i = 0, ci; ci = c[i]; i++) {
                    var n = prev(ci);
                    if (n && is(n, ss)) {
                        r[++ri] = ci
                    }
                }
                return r
            }
        }
    }
} ();
Ext.query = Ext.DomQuery.select;
Ext.util.Observable = function() {
    if (this.listeners) {
        this.on(this.listeners);
        delete this.listeners
    }
};
Ext.util.Observable.prototype = {
    fireEvent: function() {
        if (this.eventsSuspended !== true) {
            var A = this.events[arguments[0].toLowerCase()];
            if (typeof A == "object") {
                return A.fire.apply(A, Array.prototype.slice.call(arguments, 1))
            }
        }
        return true
    },
    filterOptRe: /^(?:scope|delay|buffer|single)$/,
    addListener: function(A, C, B, F) {
        if (typeof A == "object") {
            F = A;
            for (var E in F) {
                if (this.filterOptRe.test(E)) {
                    continue
                }
                if (typeof F[E] == "function") {
                    this.addListener(E, F[E], F.scope, F)
                } else {
                    this.addListener(E, F[E].fn, F[E].scope, F[E])
                }
            }
            return
        }
        F = (!F || typeof F == "boolean") ? {}: F;
        A = A.toLowerCase();
        var D = this.events[A] || true;
        if (typeof D == "boolean") {
            D = new Ext.util.Event(this, A);
            this.events[A] = D
        }
        D.addListener(C, B, F)
    },
    removeListener: function(A, C, B) {
        var D = this.events[A.toLowerCase()];
        if (typeof D == "object") {
            D.removeListener(C, B)
        }
    },
    purgeListeners: function() {
        for (var A in this.events) {
            if (typeof this.events[A] == "object") {
                this.events[A].clearListeners()
            }
        }
    },
    relayEvents: function(F, D) {
        var E = function(G) {
            return function() {
                return this.fireEvent.apply(this, Ext.combine(G, Array.prototype.slice.call(arguments, 0)))
            }
        };
        for (var C = 0, A = D.length; C < A; C++) {
            var B = D[C];
            if (!this.events[B]) {
                this.events[B] = true
            }
            F.on(B, E(B), this)
        }
    },
    addEvents: function(D) {
        if (!this.events) {
            this.events = {}
        }
        if (typeof D == "string") {
            for (var C = 0, A = arguments, B; B = A[C]; C++) {
                if (!this.events[A[C]]) {
                    this.events[A[C]] = true
                }
            }
        } else {
            Ext.applyIf(this.events, D)
        }
    },
    hasListener: function(A) {
        var B = this.events[A];
        return typeof B == "object" && B.listeners.length > 0
    },
    suspendEvents: function() {
        this.eventsSuspended = true
    },
    resumeEvents: function() {
        this.eventsSuspended = false
    },
    getMethodEvent: function(G) {
        if (!this.methodEvents) {
            this.methodEvents = {}
        }
        var F = this.methodEvents[G];
        if (!F) {
            F = {};
            this.methodEvents[G] = F;
            F.originalFn = this[G];
            F.methodName = G;
            F.before = [];
            F.after = [];
            var C, B, D;
            var E = this;
            var A = function(J, I, H) {
                if ((B = J.apply(I || E, H)) !== undefined) {
                    if (typeof B === "object") {
                        if (B.returnValue !== undefined) {
                            C = B.returnValue
                        } else {
                            C = B
                        }
                        if (B.cancel === true) {
                            D = true
                        }
                    } else {
                        if (B === false) {
                            D = true
                        } else {
                            C = B
                        }
                    }
                }
            };
            this[G] = function() {
                C = B = undefined;
                D = false;
                var I = Array.prototype.slice.call(arguments, 0);
                for (var J = 0, H = F.before.length; J < H; J++) {
                    A(F.before[J].fn, F.before[J].scope, I);
                    if (D) {
                        return C
                    }
                }
                if ((B = F.originalFn.apply(E, I)) !== undefined) {
                    C = B
                }
                for (var J = 0, H = F.after.length; J < H; J++) {
                    A(F.after[J].fn, F.after[J].scope, I);
                    if (D) {
                        return C
                    }
                }
                return C
            }
        }
        return F
    },
    beforeMethod: function(D, B, A) {
        var C = this.getMethodEvent(D);
        C.before.push({
            fn: B,
            scope: A
        })
    },
    afterMethod: function(D, B, A) {
        var C = this.getMethodEvent(D);
        C.after.push({
            fn: B,
            scope: A
        })
    },
    removeMethodListener: function(F, D, C) {
        var E = this.getMethodEvent(F);
        for (var B = 0, A = E.before.length; B < A; B++) {
            if (E.before[B].fn == D && E.before[B].scope == C) {
                E.before.splice(B, 1);
                return
            }
        }
        for (var B = 0, A = E.after.length; B < A; B++) {
            if (E.after[B].fn == D && E.after[B].scope == C) {
                E.after.splice(B, 1);
                return
            }
        }
    }
};
Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;
Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;
Ext.util.Observable.capture = function(C, B, A) {
    C.fireEvent = C.fireEvent.createInterceptor(B, A)
};
Ext.util.Observable.releaseCapture = function(A) {
    A.fireEvent = Ext.util.Observable.prototype.fireEvent
};
(function() {
    var B = function(F, G, E) {
        var D = new Ext.util.DelayedTask();
        return function() {
            D.delay(G.buffer, F, E, Array.prototype.slice.call(arguments, 0))
        }
    };
    var C = function(F, G, E, D) {
        return function() {
            G.removeListener(E, D);
            return F.apply(D, arguments)
        }
    };
    var A = function(E, F, D) {
        return function() {
            var G = Array.prototype.slice.call(arguments, 0);
            setTimeout(function() {
                E.apply(D, G)
            },
            F.delay || 10)
        }
    };
    Ext.util.Event = function(E, D) {
        this.name = D;
        this.obj = E;
        this.listeners = []
    };
    Ext.util.Event.prototype = {
        addListener: function(G, F, E) {
            F = F || this.obj;
            if (!this.isListening(G, F)) {
                var D = this.createListener(G, F, E);
                if (!this.firing) {
                    this.listeners.push(D)
                } else {
                    this.listeners = this.listeners.slice(0);
                    this.listeners.push(D)
                }
            }
        },
        createListener: function(G, F, H) {
            H = H || {};
            F = F || this.obj;
            var D = {
                fn: G,
                scope: F,
                options: H
            };
            var E = G;
            if (H.delay) {
                E = A(E, H, F)
            }
            if (H.single) {
                E = C(E, this, G, F)
            }
            if (H.buffer) {
                E = B(E, H, F)
            }
            D.fireFn = E;
            return D
        },
        findListener: function(I, H) {
            H = H || this.obj;
            var F = this.listeners;
            for (var G = 0, D = F.length; G < D; G++) {
                var E = F[G];
                if (E.fn == I && E.scope == H) {
                    return G
                }
            }
            return - 1
        },
        isListening: function(E, D) {
            return this.findListener(E, D) != -1
        },
        removeListener: function(F, E) {
            var D;
            if ((D = this.findListener(F, E)) != -1) {
                if (!this.firing) {
                    this.listeners.splice(D, 1)
                } else {
                    this.listeners = this.listeners.slice(0);
                    this.listeners.splice(D, 1)
                }
                return true
            }
            return false
        },
        clearListeners: function() {
            this.listeners = []
        },
        fire: function() {
            var F = this.listeners,
            I, D = F.length;
            if (D > 0) {
                this.firing = true;
                var G = Array.prototype.slice.call(arguments, 0);
                for (var H = 0; H < D; H++) {
                    var E = F[H];
                    if (E.fireFn.apply(E.scope || this.obj || window, arguments) === false) {
                        this.firing = false;
                        return false
                    }
                }
                this.firing = false
            }
            return true
        }
    }
})();
Ext.EventManager = function() {
    var X, Q, M = false;
    var N, W, H, S;
    var P = Ext.lib.Event;
    var R = Ext.lib.Dom;
    var A = "Ex" + "t";
    var J = {};
    var O = function(b, E, a, Z, Y) {
        var d = Ext.id(b);
        if (!J[d]) {
            J[d] = {}
        }
        var c = J[d];
        if (!c[E]) {
            c[E] = []
        }
        var D = c[E];
        D.push({
            id: d,
            ename: E,
            fn: a,
            wrap: Z,
            scope: Y
        });
        P.on(b, E, Z);
        if (E == "mousewheel" && b.addEventListener) {
            b.addEventListener("DOMMouseScroll", Z, false);
            P.on(window, "unload",
            function() {
                b.removeEventListener("DOMMouseScroll", Z, false)
            })
        }
        if (E == "mousedown" && b == document) {
            Ext.EventManager.stoppedMouseDownEvent.addListener(Z)
        }
    };
    var I = function(Y, a, e, g) {
        Y = Ext.getDom(Y);
        var D = Ext.id(Y),
        f = J[D],
        E;
        if (f) {
            var c = f[a],
            Z;
            if (c) {
                for (var b = 0, d = c.length; b < d; b++) {
                    Z = c[b];
                    if (Z.fn == e && (!g || Z.scope == g)) {
                        E = Z.wrap;
                        P.un(Y, a, E);
                        c.splice(b, 1);
                        break
                    }
                }
            }
        }
        if (a == "mousewheel" && Y.addEventListener && E) {
            Y.removeEventListener("DOMMouseScroll", E, false)
        }
        if (a == "mousedown" && Y == document && E) {
            Ext.EventManager.stoppedMouseDownEvent.removeListener(E)
        }
    };
    var F = function(a) {
        a = Ext.getDom(a);
        var c = Ext.id(a),
        b = J[c],
        E;
        if (b) {
            for (var Z in b) {
                if (b.hasOwnProperty(Z)) {
                    E = b[Z];
                    for (var Y = 0, D = E.length; Y < D; Y++) {
                        P.un(a, Z, E[Y].wrap);
                        E[Y] = null
                    }
                }
                b[Z] = null
            }
            delete J[c]
        }
    };
    var C = function() {
        if (!M) {
            M = Ext.isReady = true;
            if (Ext.isGecko || Ext.isOpera) {
                document.removeEventListener("DOMContentLoaded", C, false)
            }
        }
        if (Q) {
            clearInterval(Q);
            Q = null
        }
        if (X) {
            X.fire();
            X.clearListeners()
        }
    };
    var B = function() {
        X = new Ext.util.Event();
        if (Ext.isReady) {
            return
        }
        P.on(window, "load", C);
        if (Ext.isGecko || Ext.isOpera) {
            document.addEventListener("DOMContentLoaded", C, false)
        } else {
            if (Ext.isIE) {
                document.onreadystatechange = function() {
                    if (document.readyState == "complete") {
                        document.onreadystatechange = null;
                        C()
                    }
                }
            } else {
                if (Ext.isSafari) {
                    Q = setInterval(function() {
                        var D = document.readyState;
                        if (D == "complete") {
                            C()
                        }
                    },
                    10)
                }
            }
        }
    };
    var V = function(E, Y) {
        var D = new Ext.util.DelayedTask(E);
        return function(Z) {
            Z = new Ext.EventObjectImpl(Z);
            D.delay(Y.buffer, E, null, [Z])
        }
    };
    var T = function(a, Z, D, Y, E) {
        return function(b) {
            Ext.EventManager.removeListener(Z, D, Y, E);
            a(b)
        }
    };
    var G = function(D, E) {
        return function(Y) {
            Y = new Ext.EventObjectImpl(Y);
            setTimeout(function() {
                D(Y)
            },
            E.delay || 10)
        }
    };
    var L = function(Y, E, D, c, b) {
        var d = (!D || typeof D == "boolean") ? {}: D;
        c = c || d.fn;
        b = b || d.scope;
        var a = Ext.getDom(Y);
        if (!a) {
            throw "Error listening for \"" + E + "\". Element \"" + Y + "\" doesn't exist."
        }
        var Z = function(g) {
            if (!window[A]) {
                return
            }
            g = Ext.EventObject.setEvent(g);
            var f;
            if (d.delegate) {
                f = g.getTarget(d.delegate, a);
                if (!f) {
                    return
                }
            } else {
                f = g.target
            }
            if (d.stopEvent === true) {
                g.stopEvent()
            }
            if (d.preventDefault === true) {
                g.preventDefault()
            }
            if (d.stopPropagation === true) {
                g.stopPropagation()
            }
            if (d.normalized === false) {
                g = g.browserEvent
            }
            c.call(b || a, g, f, d)
        };
        if (d.delay) {
            Z = G(Z, d)
        }
        if (d.single) {
            Z = T(Z, a, E, c, b)
        }
        if (d.buffer) {
            Z = V(Z, d)
        }
        O(a, E, c, Z, b);
        return Z
    };
    var K = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
    var U = {
        addListener: function(Y, D, a, Z, E) {
            if (typeof D == "object") {
                var c = D;
                for (var b in c) {
                    if (K.test(b)) {
                        continue
                    }
                    if (typeof c[b] == "function") {
                        L(Y, b, c, c[b], c.scope)
                    } else {
                        L(Y, b, c[b])
                    }
                }
                return
            }
            return L(Y, D, E, a, Z)
        },
        removeListener: function(E, D, Z, Y) {
            return I(E, D, Z, Y)
        },
        removeAll: function(D) {
            return F(D)
        },
        onDocumentReady: function(Y, E, D) {
            if (!X) {
                B()
            }
            if (M || Ext.isReady) {
                D || (D = {});
                Y.defer(D.delay || 0, E)
            } else {
                X.addListener(Y, E, D)
            }
        },
        onWindowResize: function(Y, E, D) {
            if (!N) {
                N = new Ext.util.Event();
                W = new Ext.util.DelayedTask(function() {
                    N.fire(R.getViewWidth(), R.getViewHeight())
                });
                P.on(window, "resize", this.fireWindowResize, this)
            }
            N.addListener(Y, E, D)
        },
        fireWindowResize: function() {
            if (N) {
                if ((Ext.isIE || Ext.isAir) && W) {
                    W.delay(50)
                } else {
                    N.fire(R.getViewWidth(), R.getViewHeight())
                }
            }
        },
        onTextResize: function(Z, Y, D) {
            if (!H) {
                H = new Ext.util.Event();
                var E = new Ext.Element(document.createElement("div"));
                E.dom.className = "x-text-resize";
                E.dom.innerHTML = "X";
                E.appendTo(document.body);
                S = E.dom.offsetHeight;
                setInterval(function() {
                    if (E.dom.offsetHeight != S) {
                        H.fire(S, S = E.dom.offsetHeight)
                    }
                },
                this.textResizeInterval)
            }
            H.addListener(Z, Y, D)
        },
        removeResizeListener: function(E, D) {
            if (N) {
                N.removeListener(E, D)
            }
        },
        fireResize: function() {
            if (N) {
                N.fire(R.getViewWidth(), R.getViewHeight())
            }
        },
        ieDeferSrc: false,
        textResizeInterval: 50
    };
    U.on = U.addListener;
    U.un = U.removeListener;
    U.stoppedMouseDownEvent = new Ext.util.Event();
    return U
} ();
Ext.onReady = Ext.EventManager.onDocumentReady;
(function() {
    var A = function() {
        var C = document.body || document.getElementsByTagName("body")[0];
        if (!C) {
            return false
        }
        var B = [" ", Ext.isIE ? "ext-ie " + (Ext.isIE6 ? "ext-ie6": "ext-ie7") : Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? "ext-gecko2": "ext-gecko3") : Ext.isOpera ? "ext-opera": Ext.isSafari ? "ext-safari": ""];
        if (Ext.isMac) {
            B.push("ext-mac")
        }
        if (Ext.isLinux) {
            B.push("ext-linux")
        }
        if (Ext.isBorderBox) {
            B.push("ext-border-box")
        }
        if (Ext.isStrict) {
            var D = C.parentNode;
            if (D) {
                D.className += " ext-strict"
            }
        }
        C.className += B.join(" ");
        return true
    };
    if (!A()) {
        Ext.onReady(A)
    }
})();
Ext.EventObject = function() {
    var B = Ext.lib.Event;
    var A = {
        3 : 13,
        63234 : 37,
        63235 : 39,
        63232 : 38,
        63233 : 40,
        63276 : 33,
        63277 : 34,
        63272 : 46,
        63273 : 36,
        63275 : 35
    };
    var C = Ext.isIE ? {
        1 : 0,
        4 : 1,
        2 : 2
    }: (Ext.isSafari ? {
        1 : 0,
        2 : 1,
        3 : 2
    }: {
        0 : 0,
        1 : 1,
        2 : 2
    });
    Ext.EventObjectImpl = function(D) {
        if (D) {
            this.setEvent(D.browserEvent || D)
        }
    };
    Ext.EventObjectImpl.prototype = {
        browserEvent: null,
        button: -1,
        shiftKey: false,
        ctrlKey: false,
        altKey: false,
        BACKSPACE: 8,
        TAB: 9,
        NUM_CENTER: 12,
        ENTER: 13,
        RETURN: 13,
        SHIFT: 16,
        CTRL: 17,
        CONTROL: 17,
        ALT: 18,
        PAUSE: 19,
        CAPS_LOCK: 20,
        ESC: 27,
        SPACE: 32,
        PAGE_UP: 33,
        PAGEUP: 33,
        PAGE_DOWN: 34,
        PAGEDOWN: 34,
        END: 35,
        HOME: 36,
        LEFT: 37,
        UP: 38,
        RIGHT: 39,
        DOWN: 40,
        PRINT_SCREEN: 44,
        INSERT: 45,
        DELETE: 46,
        ZERO: 48,
        ONE: 49,
        TWO: 50,
        THREE: 51,
        FOUR: 52,
        FIVE: 53,
        SIX: 54,
        SEVEN: 55,
        EIGHT: 56,
        NINE: 57,
        A: 65,
        B: 66,
        C: 67,
        D: 68,
        E: 69,
        F: 70,
        G: 71,
        H: 72,
        I: 73,
        J: 74,
        K: 75,
        L: 76,
        M: 77,
        N: 78,
        O: 79,
        P: 80,
        Q: 81,
        R: 82,
        S: 83,
        T: 84,
        U: 85,
        V: 86,
        W: 87,
        X: 88,
        Y: 89,
        Z: 90,
        CONTEXT_MENU: 93,
        NUM_ZERO: 96,
        NUM_ONE: 97,
        NUM_TWO: 98,
        NUM_THREE: 99,
        NUM_FOUR: 100,
        NUM_FIVE: 101,
        NUM_SIX: 102,
        NUM_SEVEN: 103,
        NUM_EIGHT: 104,
        NUM_NINE: 105,
        NUM_MULTIPLY: 106,
        NUM_PLUS: 107,
        NUM_MINUS: 109,
        NUM_PERIOD: 110,
        NUM_DIVISION: 111,
        F1: 112,
        F2: 113,
        F3: 114,
        F4: 115,
        F5: 116,
        F6: 117,
        F7: 118,
        F8: 119,
        F9: 120,
        F10: 121,
        F11: 122,
        F12: 123,
        setEvent: function(D) {
            if (D == this || (D && D.browserEvent)) {
                return D
            }
            this.browserEvent = D;
            if (D) {
                this.button = D.button ? C[D.button] : (D.which ? D.which - 1 : -1);
                if (D.type == "click" && this.button == -1) {
                    this.button = 0
                }
                this.type = D.type;
                this.shiftKey = D.shiftKey;
                this.ctrlKey = D.ctrlKey || D.metaKey;
                this.altKey = D.altKey;
                this.keyCode = D.keyCode;
                this.charCode = D.charCode;
                this.target = B.getTarget(D);
                this.xy = B.getXY(D)
            } else {
                this.button = -1;
                this.shiftKey = false;
                this.ctrlKey = false;
                this.altKey = false;
                this.keyCode = 0;
                this.charCode = 0;
                this.target = null;
                this.xy = [0, 0]
            }
            return this
        },
        stopEvent: function() {
            if (this.browserEvent) {
                if (this.browserEvent.type == "mousedown") {
                    Ext.EventManager.stoppedMouseDownEvent.fire(this)
                }
                B.stopEvent(this.browserEvent)
            }
        },
        preventDefault: function() {
            if (this.browserEvent) {
                B.preventDefault(this.browserEvent)
            }
        },
        isNavKeyPress: function() {
            var D = this.keyCode;
            D = Ext.isSafari ? (A[D] || D) : D;
            return (D >= 33 && D <= 40) || D == this.RETURN || D == this.TAB || D == this.ESC
        },
        isSpecialKey: function() {
            var D = this.keyCode;
            return (this.type == "keypress" && this.ctrlKey) || D == 9 || D == 13 || D == 40 || D == 27 || (D == 16) || (D == 17) || (D >= 18 && D <= 20) || (D >= 33 && D <= 35) || (D >= 36 && D <= 39) || (D >= 44 && D <= 45)
        },
        stopPropagation: function() {
            if (this.browserEvent) {
                if (this.browserEvent.type == "mousedown") {
                    Ext.EventManager.stoppedMouseDownEvent.fire(this)
                }
                B.stopPropagation(this.browserEvent)
            }
        },
        getCharCode: function() {
            return this.charCode || this.keyCode
        },
        getKey: function() {
            var D = this.keyCode || this.charCode;
            return Ext.isSafari ? (A[D] || D) : D
        },
        getPageX: function() {
            return this.xy[0]
        },
        getPageY: function() {
            return this.xy[1]
        },
        getTime: function() {
            if (this.browserEvent) {
                return B.getTime(this.browserEvent)
            }
            return null
        },
        getXY: function() {
            return this.xy
        },
        getTarget: function(E, F, D) {
            return E ? Ext.fly(this.target).findParent(E, F, D) : (D ? Ext.get(this.target) : this.target)
        },
        getRelatedTarget: function() {
            if (this.browserEvent) {
                return B.getRelatedTarget(this.browserEvent)
            }
            return null
        },
        getWheelDelta: function() {
            var D = this.browserEvent;
            var E = 0;
            if (D.wheelDelta) {
                E = D.wheelDelta / 120
            } else {
                if (D.detail) {
                    E = -D.detail / 3
                }
            }
            return E
        },
        hasModifier: function() {
            return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true: false
        },
        within: function(E, F) {
            var D = this[F ? "getRelatedTarget": "getTarget"]();
            return D && Ext.fly(E).contains(D)
        },
        getPoint: function() {
            return new Ext.lib.Point(this.xy[0], this.xy[1])
        }
    };
    return new Ext.EventObjectImpl()
} ();
(function() {
    var D = Ext.lib.Dom;
    var E = Ext.lib.Event;
    var A = Ext.lib.Anim;
    var propCache = {};
    var camelRe = /(-[a-z])/gi;
    var camelFn = function(m, a) {
        return a.charAt(1).toUpperCase()
    };
    var view = document.defaultView;
    Ext.Element = function(element, forceNew) {
        var dom = typeof element == "string" ? document.getElementById(element) : element;
        if (!dom) {
            return null
        }
        var id = dom.id;
        if (forceNew !== true && id && Ext.Element.cache[id]) {
            return Ext.Element.cache[id]
        }
        this.dom = dom;
        this.id = id || Ext.id(dom)
    };
    var El = Ext.Element;
    El.prototype = {
        originalDisplay: "",
        visibilityMode: 1,
        defaultUnit: "px",
        setVisibilityMode: function(visMode) {
            this.visibilityMode = visMode;
            return this
        },
        enableDisplayMode: function(display) {
            this.setVisibilityMode(El.DISPLAY);
            if (typeof display != "undefined") {
                this.originalDisplay = display
            }
            return this
        },
        findParent: function(simpleSelector, maxDepth, returnEl) {
            var p = this.dom,
            b = document.body,
            depth = 0,
            dq = Ext.DomQuery,
            stopEl;
            maxDepth = maxDepth || 50;
            if (typeof maxDepth != "number") {
                stopEl = Ext.getDom(maxDepth);
                maxDepth = 10
            }
            while (p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl) {
                if (dq.is(p, simpleSelector)) {
                    return returnEl ? Ext.get(p) : p
                }
                depth++;
                p = p.parentNode
            }
            return null
        },
        findParentNode: function(simpleSelector, maxDepth, returnEl) {
            var p = Ext.fly(this.dom.parentNode, "_internal");
            return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null
        },
        up: function(simpleSelector, maxDepth) {
            return this.findParentNode(simpleSelector, maxDepth, true)
        },
        is: function(simpleSelector) {
            return Ext.DomQuery.is(this.dom, simpleSelector)
        },
        animate: function(args, duration, onComplete, easing, animType) {
            this.anim(args, {
                duration: duration,
                callback: onComplete,
                easing: easing
            },
            animType);
            return this
        },
        anim: function(args, opt, animType, defaultDur, defaultEase, cb) {
            animType = animType || "run";
            opt = opt || {};
            var anim = Ext.lib.Anim[animType](this.dom, args, (opt.duration || defaultDur) || 0.35, (opt.easing || defaultEase) || "easeOut",
            function() {
                Ext.callback(cb, this);
                Ext.callback(opt.callback, opt.scope || this, [this, opt])
            },
            this);
            opt.anim = anim;
            return anim
        },
        preanim: function(a, i) {
            return ! a[i] ? false: (typeof a[i] == "object" ? a[i] : {
                duration: a[i + 1],
                callback: a[i + 2],
                easing: a[i + 3]
            })
        },
        clean: function(forceReclean) {
            if (this.isCleaned && forceReclean !== true) {
                return this
            }
            var ns = /\S/;
            var d = this.dom,
            n = d.firstChild,
            ni = -1;
            while (n) {
                var nx = n.nextSibling;
                if (n.nodeType == 3 && !ns.test(n.nodeValue)) {
                    d.removeChild(n)
                } else {
                    n.nodeIndex = ++ni
                }
                n = nx
            }
            this.isCleaned = true;
            return this
        },
        scrollIntoView: function(container, hscroll) {
            var c = Ext.getDom(container) || Ext.getBody().dom;
            var el = this.dom;
            var o = this.getOffsetsTo(c),
            l = o[0] + c.scrollLeft,
            t = o[1] + c.scrollTop,
            b = t + el.offsetHeight,
            r = l + el.offsetWidth;
            var ch = c.clientHeight;
            var ct = parseInt(c.scrollTop, 10);
            var cl = parseInt(c.scrollLeft, 10);
            var cb = ct + ch;
            var cr = cl + c.clientWidth;
            if (el.offsetHeight > ch || t < ct) {
                c.scrollTop = t
            } else {
                if (b > cb) {
                    c.scrollTop = b - ch
                }
            }
            c.scrollTop = c.scrollTop;
            if (hscroll !== false) {
                if (el.offsetWidth > c.clientWidth || l < cl) {
                    c.scrollLeft = l
                } else {
                    if (r > cr) {
                        c.scrollLeft = r - c.clientWidth
                    }
                }
                c.scrollLeft = c.scrollLeft
            }
            return this
        },
        scrollChildIntoView: function(child, hscroll) {
            Ext.fly(child, "_scrollChildIntoView").scrollIntoView(this, hscroll)
        },
        autoHeight: function(animate, duration, onComplete, easing) {
            var oldHeight = this.getHeight();
            this.clip();
            this.setHeight(1);
            setTimeout(function() {
                var height = parseInt(this.dom.scrollHeight, 10);
                if (!animate) {
                    this.setHeight(height);
                    this.unclip();
                    if (typeof onComplete == "function") {
                        onComplete()
                    }
                } else {
                    this.setHeight(oldHeight);
                    this.setHeight(height, animate, duration,
                    function() {
                        this.unclip();
                        if (typeof onComplete == "function") {
                            onComplete()
                        }
                    }.createDelegate(this), easing)
                }
            }.createDelegate(this), 0);
            return this
        },
        contains: function(el) {
            if (!el) {
                return false
            }
            return D.isAncestor(this.dom, el.dom ? el.dom: el)
        },
        isVisible: function(deep) {
            var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none");
            if (deep !== true || !vis) {
                return vis
            }
            var p = this.dom.parentNode;
            while (p && p.tagName.toLowerCase() != "body") {
                if (!Ext.fly(p, "_isVisible").isVisible()) {
                    return false
                }
                p = p.parentNode
            }
            return true
        },
        select: function(selector, unique) {
            return El.select(selector, unique, this.dom)
        },
        query: function(selector) {
            return Ext.DomQuery.select(selector, this.dom)
        },
        child: function(selector, returnDom) {
            var n = Ext.DomQuery.selectNode(selector, this.dom);
            return returnDom ? n: Ext.get(n)
        },
        down: function(selector, returnDom) {
            var n = Ext.DomQuery.selectNode(" > " + selector, this.dom);
            return returnDom ? n: Ext.get(n)
        },
        initDD: function(group, config, overrides) {
            var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
            return Ext.apply(dd, overrides)
        },
        initDDProxy: function(group, config, overrides) {
            var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
            return Ext.apply(dd, overrides)
        },
        initDDTarget: function(group, config, overrides) {
            var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
            return Ext.apply(dd, overrides)
        },
        setVisible: function(visible, animate) {
            if (!animate || !A) {
                if (this.visibilityMode == El.DISPLAY) {
                    this.setDisplayed(visible)
                } else {
                    this.fixDisplay();
                    this.dom.style.visibility = visible ? "visible": "hidden"
                }
            } else {
                var dom = this.dom;
                var visMode = this.visibilityMode;
                if (visible) {
                    this.setOpacity(0.01);
                    this.setVisible(true)
                }
                this.anim({
                    opacity: {
                        to: (visible ? 1 : 0)
                    }
                },
                this.preanim(arguments, 1), null, 0.35, "easeIn",
                function() {
                    if (!visible) {
                        if (visMode == El.DISPLAY) {
                            dom.style.display = "none"
                        } else {
                            dom.style.visibility = "hidden"
                        }
                        Ext.get(dom).setOpacity(1)
                    }
                })
            }
            return this
        },
        isDisplayed: function() {
            return this.getStyle("display") != "none"
        },
        toggle: function(animate) {
            this.setVisible(!this.isVisible(), this.preanim(arguments, 0));
            return this
        },
        setDisplayed: function(value) {
            if (typeof value == "boolean") {
                value = value ? this.originalDisplay: "none"
            }
            this.setStyle("display", value);
            return this
        },
        focus: function() {
            try {
                this.dom.focus()
            } catch(e) {}
            return this
        },
        blur: function() {
            try {
                this.dom.blur()
            } catch(e) {}
            return this
        },
        addClass: function(className) {
            if (Ext.isArray(className)) {
                for (var i = 0, len = className.length; i < len; i++) {
                    this.addClass(className[i])
                }
            } else {
                if (className && !this.hasClass(className)) {
                    this.dom.className = this.dom.className + " " + className
                }
            }
            return this
        },
        radioClass: function(className) {
            var siblings = this.dom.parentNode.childNodes;
            for (var i = 0; i < siblings.length; i++) {
                var s = siblings[i];
                if (s.nodeType == 1) {
                    Ext.get(s).removeClass(className)
                }
            }
            this.addClass(className);
            return this
        },
        removeClass: function(className) {
            if (!className || !this.dom.className) {
                return this
            }
            if (Ext.isArray(className)) {
                for (var i = 0, len = className.length; i < len; i++) {
                    this.removeClass(className[i])
                }
            } else {
                if (this.hasClass(className)) {
                    var re = this.classReCache[className];
                    if (!re) {
                        re = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)", "g");
                        this.classReCache[className] = re
                    }
                    this.dom.className = this.dom.className.replace(re, " ")
                }
            }
            return this
        },
        classReCache: {},
        toggleClass: function(className) {
            if (this.hasClass(className)) {
                this.removeClass(className)
            } else {
                this.addClass(className)
            }
            return this
        },
        hasClass: function(className) {
            return className && (" " + this.dom.className + " ").indexOf(" " + className + " ") != -1
        },
        replaceClass: function(oldClassName, newClassName) {
            this.removeClass(oldClassName);
            this.addClass(newClassName);
            return this
        },
        getStyles: function() {
            var a = arguments,
            len = a.length,
            r = {};
            for (var i = 0; i < len; i++) {
                r[a[i]] = this.getStyle(a[i])
            }
            return r
        },
        getStyle: function() {
            return view && view.getComputedStyle ?
            function(prop) {
                var el = this.dom,
                v, cs, camel;
                if (prop == "float") {
                    prop = "cssFloat"
                }
                if (v = el.style[prop]) {
                    return v
                }
                if (cs = view.getComputedStyle(el, "")) {
                    if (! (camel = propCache[prop])) {
                        camel = propCache[prop] = prop.replace(camelRe, camelFn)
                    }
                    return cs[camel]
                }
                return null
            }: function(prop) {
                var el = this.dom,
                v, cs, camel;
                if (prop == "opacity") {
                    if (typeof el.style.filter == "string") {
                        var m = el.style.filter.match(/alpha\(opacity=(.*)\)/i);
                        if (m) {
                            var fv = parseFloat(m[1]);
                            if (!isNaN(fv)) {
                                return fv ? fv / 100 : 0
                            }
                        }
                    }
                    return 1
                } else {
                    if (prop == "float") {
                        prop = "styleFloat"
                    }
                }
                if (! (camel = propCache[prop])) {
                    camel = propCache[prop] = prop.replace(camelRe, camelFn)
                }
                if (v = el.style[camel]) {
                    return v
                }
                if (cs = el.currentStyle) {
                    return cs[camel]
                }
                return null
            }
        } (),
        setStyle: function(prop, value) {
            if (typeof prop == "string") {
                var camel;
                if (! (camel = propCache[prop])) {
                    camel = propCache[prop] = prop.replace(camelRe, camelFn)
                }
                if (camel == "opacity") {
                    this.setOpacity(value)
                } else {
                    this.dom.style[camel] = value
                }
            } else {
                for (var style in prop) {
                    if (typeof prop[style] != "function") {
                        this.setStyle(style, prop[style])
                    }
                }
            }
            return this
        },
        applyStyles: function(style) {
            Ext.DomHelper.applyStyles(this.dom, style);
            return this
        },
        getX: function() {
            return D.getX(this.dom)
        },
        getY: function() {
            return D.getY(this.dom)
        },
        getXY: function() {
            return D.getXY(this.dom)
        },
        getOffsetsTo: function(el) {
            var o = this.getXY();
            var e = Ext.fly(el, "_internal").getXY();
            return [o[0] - e[0], o[1] - e[1]]
        },
        setX: function(x, animate) {
            if (!animate || !A) {
                D.setX(this.dom, x)
            } else {
                this.setXY([x, this.getY()], this.preanim(arguments, 1))
            }
            return this
        },
        setY: function(y, animate) {
            if (!animate || !A) {
                D.setY(this.dom, y)
            } else {
                this.setXY([this.getX(), y], this.preanim(arguments, 1))
            }
            return this
        },
        setLeft: function(left) {
            this.setStyle("left", this.addUnits(left));
            return this
        },
        setTop: function(top) {
            this.setStyle("top", this.addUnits(top));
            return this
        },
        setRight: function(right) {
            this.setStyle("right", this.addUnits(right));
            return this
        },
        setBottom: function(bottom) {
            this.setStyle("bottom", this.addUnits(bottom));
            return this
        },
        setXY: function(pos, animate) {
            if (!animate || !A) {
                D.setXY(this.dom, pos)
            } else {
                this.anim({
                    points: {
                        to: pos
                    }
                },
                this.preanim(arguments, 1), "motion")
            }
            return this
        },
        setLocation: function(x, y, animate) {
            this.setXY([x, y], this.preanim(arguments, 2));
            return this
        },
        moveTo: function(x, y, animate) {
            this.setXY([x, y], this.preanim(arguments, 2));
            return this
        },
        getRegion: function() {
            return D.getRegion(this.dom)
        },
        getHeight: function(contentHeight) {
            var h = this.dom.offsetHeight || 0;
            h = contentHeight !== true ? h: h - this.getBorderWidth("tb") - this.getPadding("tb");
            return h < 0 ? 0 : h
        },
        getWidth: function(contentWidth) {
            var w = this.dom.offsetWidth || 0;
            w = contentWidth !== true ? w: w - this.getBorderWidth("lr") - this.getPadding("lr");
            return w < 0 ? 0 : w
        },
        getComputedHeight: function() {
            var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);
            if (!h) {
                h = parseInt(this.getStyle("height"), 10) || 0;
                if (!this.isBorderBox()) {
                    h += this.getFrameWidth("tb")
                }
            }
            return h
        },
        getComputedWidth: function() {
            var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
            if (!w) {
                w = parseInt(this.getStyle("width"), 10) || 0;
                if (!this.isBorderBox()) {
                    w += this.getFrameWidth("lr")
                }
            }
            return w
        },
        getSize: function(contentSize) {
            return {
                width: this.getWidth(contentSize),
                height: this.getHeight(contentSize)
            }
        },
        getStyleSize: function() {
            var w, h, d = this.dom,
            s = d.style;
            if (s.width && s.width != "auto") {
                w = parseInt(s.width, 10);
                if (Ext.isBorderBox) {
                    w -= this.getFrameWidth("lr")
                }
            }
            if (s.height && s.height != "auto") {
                h = parseInt(s.height, 10);
                if (Ext.isBorderBox) {
                    h -= this.getFrameWidth("tb")
                }
            }
            return {
                width: w || this.getWidth(true),
                height: h || this.getHeight(true)
            }
        },
        getViewSize: function() {
            var d = this.dom,
            doc = document,
            aw = 0,
            ah = 0;
            if (d == doc || d == doc.body) {
                return {
                    width: D.getViewWidth(),
                    height: D.getViewHeight()
                }
            } else {
                return {
                    width: d.clientWidth,
                    height: d.clientHeight
                }
            }
        },
        getValue: function(asNumber) {
            return asNumber ? parseInt(this.dom.value, 10) : this.dom.value
        },
        adjustWidth: function(width) {
            if (typeof width == "number") {
                if (this.autoBoxAdjust && !this.isBorderBox()) {
                    width -= (this.getBorderWidth("lr") + this.getPadding("lr"))
                }
                if (width < 0) {
                    width = 0
                }
            }
            return width
        },
        adjustHeight: function(height) {
            if (typeof height == "number") {
                if (this.autoBoxAdjust && !this.isBorderBox()) {
                    height -= (this.getBorderWidth("tb") + this.getPadding("tb"))
                }
                if (height < 0) {
                    height = 0
                }
            }
            return height
        },
        setWidth: function(width, animate) {
            width = this.adjustWidth(width);
            if (!animate || !A) {
                this.dom.style.width = this.addUnits(width)
            } else {
                this.anim({
                    width: {
                        to: width
                    }
                },
                this.preanim(arguments, 1))
            }
            return this
        },
        setHeight: function(height, animate) {
            height = this.adjustHeight(height);
            if (!animate || !A) {
                this.dom.style.height = this.addUnits(height)
            } else {
                this.anim({
                    height: {
                        to: height
                    }
                },
                this.preanim(arguments, 1))
            }
            return this
        },
        setSize: function(width, height, animate) {
            if (typeof width == "object") {
                height = width.height;
                width = width.width
            }
            width = this.adjustWidth(width);
            height = this.adjustHeight(height);
            if (!animate || !A) {
                this.dom.style.width = this.addUnits(width);
                this.dom.style.height = this.addUnits(height)
            } else {
                this.anim({
                    width: {
                        to: width
                    },
                    height: {
                        to: height
                    }
                },
                this.preanim(arguments, 2))
            }
            return this
        },
        setBounds: function(x, y, width, height, animate) {
            if (!animate || !A) {
                this.setSize(width, height);
                this.setLocation(x, y)
            } else {
                width = this.adjustWidth(width);
                height = this.adjustHeight(height);
                this.anim({
                    points: {
                        to: [x, y]
                    },
                    width: {
                        to: width
                    },
                    height: {
                        to: height
                    }
                },
                this.preanim(arguments, 4), "motion")
            }
            return this
        },
        setRegion: function(region, animate) {
            this.setBounds(region.left, region.top, region.right - region.left, region.bottom - region.top, this.preanim(arguments, 1));
            return this
        },
        addListener: function(eventName, fn, scope, options) {
            Ext.EventManager.on(this.dom, eventName, fn, scope || this, options)
        },
        removeListener: function(eventName, fn, scope) {
            Ext.EventManager.removeListener(this.dom, eventName, fn, scope || this);
            return this
        },
        removeAllListeners: function() {
            Ext.EventManager.removeAll(this.dom);
            return this
        },
        relayEvent: function(eventName, observable) {
            this.on(eventName,
            function(e) {
                observable.fireEvent(eventName, e)
            })
        },
        setOpacity: function(opacity, animate) {
            if (!animate || !A) {
                var s = this.dom.style;
                if (Ext.isIE) {
                    s.zoom = 1;
                    s.filter = (s.filter || "").replace(/alpha\([^\)]*\)/gi, "") + (opacity == 1 ? "": " alpha(opacity=" + opacity * 100 + ")")
                } else {
                    s.opacity = opacity
                }
            } else {
                this.anim({
                    opacity: {
                        to: opacity
                    }
                },
                this.preanim(arguments, 1), null, 0.35, "easeIn")
            }
            return this
        },
        getLeft: function(local) {
            if (!local) {
                return this.getX()
            } else {
                return parseInt(this.getStyle("left"), 10) || 0
            }
        },
        getRight: function(local) {
            if (!local) {
                return this.getX() + this.getWidth()
            } else {
                return (this.getLeft(true) + this.getWidth()) || 0
            }
        },
        getTop: function(local) {
            if (!local) {
                return this.getY()
            } else {
                return parseInt(this.getStyle("top"), 10) || 0
            }
        },
        getBottom: function(local) {
            if (!local) {
                return this.getY() + this.getHeight()
            } else {
                return (this.getTop(true) + this.getHeight()) || 0
            }
        },
        position: function(pos, zIndex, x, y) {
            if (!pos) {
                if (this.getStyle("position") == "static") {
                    this.setStyle("position", "relative")
                }
            } else {
                this.setStyle("position", pos)
            }
            if (zIndex) {
                this.setStyle("z-index", zIndex)
            }
            if (x !== undefined && y !== undefined) {
                this.setXY([x, y])
            } else {
                if (x !== undefined) {
                    this.setX(x)
                } else {
                    if (y !== undefined) {
                        this.setY(y)
                    }
                }
            }
        },
        clearPositioning: function(value) {
            value = value || "";
            this.setStyle({
                "left": value,
                "right": value,
                "top": value,
                "bottom": value,
                "z-index": "",
                "position": "static"
            });
            return this
        },
        getPositioning: function() {
            var l = this.getStyle("left");
            var t = this.getStyle("top");
            return {
                "position": this.getStyle("position"),
                "left": l,
                "right": l ? "": this.getStyle("right"),
                "top": t,
                "bottom": t ? "": this.getStyle("bottom"),
                "z-index": this.getStyle("z-index")
            }
        },
        getBorderWidth: function(side) {
            return this.addStyles(side, El.borders)
        },
        getPadding: function(side) {
            return this.addStyles(side, El.paddings)
        },
        setPositioning: function(pc) {
            this.applyStyles(pc);
            if (pc.right == "auto") {
                this.dom.style.right = ""
            }
            if (pc.bottom == "auto") {
                this.dom.style.bottom = ""
            }
            return this
        },
        fixDisplay: function() {
            if (this.getStyle("display") == "none") {
                this.setStyle("visibility", "hidden");
                this.setStyle("display", this.originalDisplay);
                if (this.getStyle("display") == "none") {
                    this.setStyle("display", "block")
                }
            }
        },
        setOverflow: function(v) {
            if (v == "auto" && Ext.isMac && Ext.isGecko2) {
                this.dom.style.overflow = "hidden";
                (function() {
                    this.dom.style.overflow = "auto"
                }).defer(1, this)
            } else {
                this.dom.style.overflow = v
            }
        },
        setLeftTop: function(left, top) {
            this.dom.style.left = this.addUnits(left);
            this.dom.style.top = this.addUnits(top);
            return this
        },
        move: function(direction, distance, animate) {
            var xy = this.getXY();
            direction = direction.toLowerCase();
            switch (direction) {
            case "l":
            case "left":
                this.moveTo(xy[0] - distance, xy[1], this.preanim(arguments, 2));
                break;
            case "r":
            case "right":
                this.moveTo(xy[0] + distance, xy[1], this.preanim(arguments, 2));
                break;
            case "t":
            case "top":
            case "up":
                this.moveTo(xy[0], xy[1] - distance, this.preanim(arguments, 2));
                break;
            case "b":
            case "bottom":
            case "down":
                this.moveTo(xy[0], xy[1] + distance, this.preanim(arguments, 2));
                break
            }
            return this
        },
        clip: function() {
            if (!this.isClipped) {
                this.isClipped = true;
                this.originalClip = {
                    "o": this.getStyle("overflow"),
                    "x": this.getStyle("overflow-x"),
                    "y": this.getStyle("overflow-y")
                };
                this.setStyle("overflow", "hidden");
                this.setStyle("overflow-x", "hidden");
                this.setStyle("overflow-y", "hidden")
            }
            return this
        },
        unclip: function() {
            if (this.isClipped) {
                this.isClipped = false;
                var o = this.originalClip;
                if (o.o) {
                    this.setStyle("overflow", o.o)
                }
                if (o.x) {
                    this.setStyle("overflow-x", o.x)
                }
                if (o.y) {
                    this.setStyle("overflow-y", o.y)
                }
            }
            return this
        },
        getAnchorXY: function(anchor, local, s) {
            var w, h, vp = false;
            if (!s) {
                var d = this.dom;
                if (d == document.body || d == document) {
                    vp = true;
                    w = D.getViewWidth();
                    h = D.getViewHeight()
                } else {
                    w = this.getWidth();
                    h = this.getHeight()
                }
            } else {
                w = s.width;
                h = s.height
            }
            var x = 0,
            y = 0,
            r = Math.round;
            switch ((anchor || "tl").toLowerCase()) {
            case "c":
                x = r(w * 0.5);
                y = r(h * 0.5);
                break;
            case "t":
                x = r(w * 0.5);
                y = 0;
                break;
            case "l":
                x = 0;
                y = r(h * 0.5);
                break;
            case "r":
                x = w;
                y = r(h * 0.5);
                break;
            case "b":
                x = r(w * 0.5);
                y = h;
                break;
            case "tl":
                x = 0;
                y = 0;
                break;
            case "bl":
                x = 0;
                y = h;
                break;
            case "br":
                x = w;
                y = h;
                break;
            case "tr":
                x = w;
                y = 0;
                break
            }
            if (local === true) {
                return [x, y]
            }
            if (vp) {
                var sc = this.getScroll();
                return [x + sc.left, y + sc.top]
            }
            var o = this.getXY();
            return [x + o[0], y + o[1]]
        },
        getAlignToXY: function(el, p, o) {
            el = Ext.get(el);
            if (!el || !el.dom) {
                throw "Element.alignToXY with an element that doesn't exist"
            }
            var d = this.dom;
            var c = false;
            var p1 = "",
            p2 = "";
            o = o || [0, 0];
            if (!p) {
                p = "tl-bl"
            } else {
                if (p == "?") {
                    p = "tl-bl?"
                } else {
                    if (p.indexOf("-") == -1) {
                        p = "tl-" + p
                    }
                }
            }
            p = p.toLowerCase();
            var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
            if (!m) {
                throw "Element.alignTo with an invalid alignment " + p
            }
            p1 = m[1];
            p2 = m[2];
            c = !!m[3];
            var a1 = this.getAnchorXY(p1, true);
            var a2 = el.getAnchorXY(p2, false);
            var x = a2[0] - a1[0] + o[0];
            var y = a2[1] - a1[1] + o[1];
            if (c) {
                var w = this.getWidth(),
                h = this.getHeight(),
                r = el.getRegion();
                var dw = D.getViewWidth() - 5,
                dh = D.getViewHeight() - 5;
                var p1y = p1.charAt(0),
                p1x = p1.charAt(p1.length - 1);
                var p2y = p2.charAt(0),
                p2x = p2.charAt(p2.length - 1);
                var swapY = ((p1y == "t" && p2y == "b") || (p1y == "b" && p2y == "t"));
                var swapX = ((p1x == "r" && p2x == "l") || (p1x == "l" && p2x == "r"));
                var doc = document;
                var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0) + 5;
                var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0) + 5;
                if ((x + w) > dw + scrollX) {
                    x = swapX ? r.left - w: dw + scrollX - w
                }
                if (x < scrollX) {
                    x = swapX ? r.right: scrollX
                }
                if ((y + h) > dh + scrollY) {
                    y = swapY ? r.top - h: dh + scrollY - h
                }
                if (y < scrollY) {
                    y = swapY ? r.bottom: scrollY
                }
            }
            return [x, y]
        },
        getConstrainToXY: function() {
            var os = {
                top: 0,
                left: 0,
                bottom: 0,
                right: 0
            };
            return function(el, local, offsets, proposedXY) {
                el = Ext.get(el);
                offsets = offsets ? Ext.applyIf(offsets, os) : os;
                var vw, vh, vx = 0,
                vy = 0;
                if (el.dom == document.body || el.dom == document) {
                    vw = Ext.lib.Dom.getViewWidth();
                    vh = Ext.lib.Dom.getViewHeight()
                } else {
                    vw = el.dom.clientWidth;
                    vh = el.dom.clientHeight;
                    if (!local) {
                        var vxy = el.getXY();
                        vx = vxy[0];
                        vy = vxy[1]
                    }
                }
                var s = el.getScroll();
                vx += offsets.left + s.left;
                vy += offsets.top + s.top;
                vw -= offsets.right;
                vh -= offsets.bottom;
                var vr = vx + vw;
                var vb = vy + vh;
                var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]);
                var x = xy[0],
                y = xy[1];
                var w = this.dom.offsetWidth,
                h = this.dom.offsetHeight;
                var moved = false;
                if ((x + w) > vr) {
                    x = vr - w;
                    moved = true
                }
                if ((y + h) > vb) {
                    y = vb - h;
                    moved = true
                }
                if (x < vx) {
                    x = vx;
                    moved = true
                }
                if (y < vy) {
                    y = vy;
                    moved = true
                }
                return moved ? [x, y] : false
            }
        } (),
        adjustForConstraints: function(xy, parent, offsets) {
            return this.getConstrainToXY(parent || document, false, offsets, xy) || xy
        },
        alignTo: function(element, position, offsets, animate) {
            var xy = this.getAlignToXY(element, position, offsets);
            this.setXY(xy, this.preanim(arguments, 3));
            return this
        },
        anchorTo: function(el, alignment, offsets, animate, monitorScroll, callback) {
            var action = function() {
                this.alignTo(el, alignment, offsets, animate);
                Ext.callback(callback, this)
            };
            Ext.EventManager.onWindowResize(action, this);
            var tm = typeof monitorScroll;
            if (tm != "undefined") {
                Ext.EventManager.on(window, "scroll", action, this, {
                    buffer: tm == "number" ? monitorScroll: 50
                })
            }
            action.call(this);
            return this
        },
        clearOpacity: function() {
            if (window.ActiveXObject) {
                if (typeof this.dom.style.filter == "string" && (/alpha/i).test(this.dom.style.filter)) {
                    this.dom.style.filter = ""
                }
            } else {
                this.dom.style.opacity = "";
                this.dom.style["-moz-opacity"] = "";
                this.dom.style["-khtml-opacity"] = ""
            }
            return this
        },
        hide: function(animate) {
            this.setVisible(false, this.preanim(arguments, 0));
            return this
        },
        show: function(animate) {
            this.setVisible(true, this.preanim(arguments, 0));
            return this
        },
        addUnits: function(size) {
            return Ext.Element.addUnits(size, this.defaultUnit)
        },
        update: function(html, loadScripts, callback) {
            if (typeof html == "undefined") {
                html = ""
            }
            if (loadScripts !== true) {
                this.dom.innerHTML = html;
                if (typeof callback == "function") {
                    callback()
                }
                return this
            }
            var id = Ext.id();
            var dom = this.dom;
            html += "<span id=\"" + id + "\"></span>";
            E.onAvailable(id,
            function() {
                var hd = document.getElementsByTagName("head")[0];
                var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
                var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
                var typeRe = /\stype=([\'\"])(.*?)\1/i;
                var match;
                while (match = re.exec(html)) {
                    var attrs = match[1];
                    var srcMatch = attrs ? attrs.match(srcRe) : false;
                    if (srcMatch && srcMatch[2]) {
                        var s = document.createElement("script");
                        s.src = srcMatch[2];
                        var typeMatch = attrs.match(typeRe);
                        if (typeMatch && typeMatch[2]) {
                            s.type = typeMatch[2]
                        }
                        hd.appendChild(s)
                    } else {
                        if (match[2] && match[2].length > 0) {
                            if (window.execScript) {
                                window.execScript(match[2])
                            } else {
                                window.eval(match[2])
                            }
                        }
                    }
                }
                var el = document.getElementById(id);
                if (el) {
                    Ext.removeNode(el)
                }
                if (typeof callback == "function") {
                    callback()
                }
            });
            dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
            return this
        },
        load: function() {
            var um = this.getUpdater();
            um.update.apply(um, arguments);
            return this
        },
        getUpdater: function() {
            if (!this.updateManager) {
                this.updateManager = new Ext.Updater(this)
            }
            return this.updateManager
        },
        unselectable: function() {
            this.dom.unselectable = "on";
            this.swallowEvent("selectstart", true);
            this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");
            this.addClass("x-unselectable");
            return this
        },
        getCenterXY: function() {
            return this.getAlignToXY(document, "c-c")
        },
        center: function(centerIn) {
            this.alignTo(centerIn || document, "c-c");
            return this
        },
        isBorderBox: function() {
            return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox
        },
        getBox: function(contentBox, local) {
            var xy;
            if (!local) {
                xy = this.getXY()
            } else {
                var left = parseInt(this.getStyle("left"), 10) || 0;
                var top = parseInt(this.getStyle("top"), 10) || 0;
                xy = [left, top]
            }
            var el = this.dom,
            w = el.offsetWidth,
            h = el.offsetHeight,
            bx;
            if (!contentBox) {
                bx = {
                    x: xy[0],
                    y: xy[1],
                    0 : xy[0],
                    1 : xy[1],
                    width: w,
                    height: h
                }
            } else {
                var l = this.getBorderWidth("l") + this.getPadding("l");
                var r = this.getBorderWidth("r") + this.getPadding("r");
                var t = this.getBorderWidth("t") + this.getPadding("t");
                var b = this.getBorderWidth("b") + this.getPadding("b");
                bx = {
                    x: xy[0] + l,
                    y: xy[1] + t,
                    0 : xy[0] + l,
                    1 : xy[1] + t,
                    width: w - (l + r),
                    height: h - (t + b)
                }
            }
            bx.right = bx.x + bx.width;
            bx.bottom = bx.y + bx.height;
            return bx
        },
        getFrameWidth: function(sides, onlyContentBox) {
            return onlyContentBox && Ext.isBorderBox ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides))
        },
        setBox: function(box, adjust, animate) {
            var w = box.width,
            h = box.height;
            if ((adjust && !this.autoBoxAdjust) && !this.isBorderBox()) {
                w -= (this.getBorderWidth("lr") + this.getPadding("lr"));
                h -= (this.getBorderWidth("tb") + this.getPadding("tb"))
            }
            this.setBounds(box.x, box.y, w, h, this.preanim(arguments, 2));
            return this
        },
        repaint: function() {
            var dom = this.dom;
            this.addClass("x-repaint");
            setTimeout(function() {
                Ext.get(dom).removeClass("x-repaint")
            },
            1);
            return this
        },
        getMargins: function(side) {
            if (!side) {
                return {
                    top: parseInt(this.getStyle("margin-top"), 10) || 0,
                    left: parseInt(this.getStyle("margin-left"), 10) || 0,
                    bottom: parseInt(this.getStyle("margin-bottom"), 10) || 0,
                    right: parseInt(this.getStyle("margin-right"), 10) || 0
                }
            } else {
                return this.addStyles(side, El.margins)
            }
        },
        addStyles: function(sides, styles) {
            var val = 0,
            v, w;
            for (var i = 0, len = sides.length; i < len; i++) {
                v = this.getStyle(styles[sides.charAt(i)]);
                if (v) {
                    w = parseInt(v, 10);
                    if (w) {
                        val += (w >= 0 ? w: -1 * w)
                    }
                }
            }
            return val
        },
        createProxy: function(config, renderTo, matchBox) {
            config = typeof config == "object" ? config: {
                tag: "div",
                cls: config
            };
            var proxy;
            if (renderTo) {
                proxy = Ext.DomHelper.append(renderTo, config, true)
            } else {
                proxy = Ext.DomHelper.insertBefore(this.dom, config, true)
            }
            if (matchBox) {
                proxy.setBox(this.getBox())
            }
            return proxy
        },
        mask: function(msg, msgCls) {
            if (this.getStyle("position") == "static") {
                this.setStyle("position", "relative")
            }
            if (this._maskMsg) {
                this._maskMsg.remove()
            }
            if (this._mask) {
                this._mask.remove()
            }
            this._mask = Ext.DomHelper.append(this.dom, {
                cls: "ext-el-mask"
            },
            true);
            this.addClass("x-masked");
            this._mask.setDisplayed(true);
            if (typeof msg == "string") {
                this._maskMsg = Ext.DomHelper.append(this.dom, {
                    cls: "ext-el-mask-msg",
                    cn: {
                        tag: "div"
                    }
                },
                true);
                var mm = this._maskMsg;
                mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls: "ext-el-mask-msg";
                mm.dom.firstChild.innerHTML = msg;
                mm.setDisplayed(true);
                mm.center(this)
            }
            if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && this.getStyle("height") == "auto") {
                this._mask.setSize(this.dom.clientWidth, this.getHeight())
            }
            return this._mask
        },
        unmask: function() {
            if (this._mask) {
                if (this._maskMsg) {
                    this._maskMsg.remove();
                    delete this._maskMsg
                }
                this._mask.remove();
                delete this._mask
            }
            this.removeClass("x-masked")
        },
        isMasked: function() {
            return this._mask && this._mask.isVisible()
        },
        createShim: function() {
            var el = document.createElement("iframe");
            el.frameBorder = "0";
            el.className = "ext-shim";
            if (Ext.isIE && Ext.isSecure) {
                el.src = Ext.SSL_SECURE_URL
            }
            var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
            shim.autoBoxAdjust = false;
            return shim
        },
        remove: function() {
            Ext.removeNode(this.dom);
            delete El.cache[this.dom.id]
        },
        hover: function(overFn, outFn, scope) {
            var preOverFn = function(e) {
                if (!e.within(this, true)) {
                    overFn.apply(scope || this, arguments)
                }
            };
            var preOutFn = function(e) {
                if (!e.within(this, true)) {
                    outFn.apply(scope || this, arguments)
                }
            };
            this.on("mouseover", preOverFn, this.dom);
            this.on("mouseout", preOutFn, this.dom);
            return this
        },
        addClassOnOver: function(className) {
            this.hover(function() {
                Ext.fly(this, "_internal").addClass(className)
            },
            function() {
                Ext.fly(this, "_internal").removeClass(className)
            });
            return this
        },
        addClassOnFocus: function(className) {
            this.on("focus",
            function() {
                Ext.fly(this, "_internal").addClass(className)
            },
            this.dom);
            this.on("blur",
            function() {
                Ext.fly(this, "_internal").removeClass(className)
            },
            this.dom);
            return this
        },
        addClassOnClick: function(className) {
            var dom = this.dom;
            this.on("mousedown",
            function() {
                Ext.fly(dom, "_internal").addClass(className);
                var d = Ext.getDoc();
                var fn = function() {
                    Ext.fly(dom, "_internal").removeClass(className);
                    d.removeListener("mouseup", fn)
                };
                d.on("mouseup", fn)
            });
            return this
        },
        swallowEvent: function(eventName, preventDefault) {
            var fn = function(e) {
                e.stopPropagation();
                if (preventDefault) {
                    e.preventDefault()
                }
            };
            if (Ext.isArray(eventName)) {
                for (var i = 0, len = eventName.length; i < len; i++) {
                    this.on(eventName[i], fn)
                }
                return this
            }
            this.on(eventName, fn);
            return this
        },
        parent: function(selector, returnDom) {
            return this.matchNode("parentNode", "parentNode", selector, returnDom)
        },
        next: function(selector, returnDom) {
            return this.matchNode("nextSibling", "nextSibling", selector, returnDom)
        },
        prev: function(selector, returnDom) {
            return this.matchNode("previousSibling", "previousSibling", selector, returnDom)
        },
        first: function(selector, returnDom) {
            return this.matchNode("nextSibling", "firstChild", selector, returnDom)
        },
        last: function(selector, returnDom) {
            return this.matchNode("previousSibling", "lastChild", selector, returnDom)
        },
        matchNode: function(dir, start, selector, returnDom) {
            var n = this.dom[start];
            while (n) {
                if (n.nodeType == 1 && (!selector || Ext.DomQuery.is(n, selector))) {
                    return ! returnDom ? Ext.get(n) : n
                }
                n = n[dir]
            }
            return null
        },
        appendChild: function(el) {
            el = Ext.get(el);
            el.appendTo(this);
            return this
        },
        createChild: function(config, insertBefore, returnDom) {
            config = config || {
                tag: "div"
            };
            if (insertBefore) {
                return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true)
            }
            return Ext.DomHelper[!this.dom.firstChild ? "overwrite": "append"](this.dom, config, returnDom !== true)
        },
        appendTo: function(el) {
            el = Ext.getDom(el);
            el.appendChild(this.dom);
            return this
        },
        insertBefore: function(el) {
            el = Ext.getDom(el);
            el.parentNode.insertBefore(this.dom, el);
            return this
        },
        insertAfter: function(el) {
            el = Ext.getDom(el);
            el.parentNode.insertBefore(this.dom, el.nextSibling);
            return this
        },
        insertFirst: function(el, returnDom) {
            el = el || {};
            if (typeof el == "object" && !el.nodeType && !el.dom) {
                return this.createChild(el, this.dom.firstChild, returnDom)
            } else {
                el = Ext.getDom(el);
                this.dom.insertBefore(el, this.dom.firstChild);
                return ! returnDom ? Ext.get(el) : el
            }
        },
        insertSibling: function(el, where, returnDom) {
            var rt;
            if (Ext.isArray(el)) {
                for (var i = 0, len = el.length; i < len; i++) {
                    rt = this.insertSibling(el[i], where, returnDom)
                }
                return rt
            }
            where = where ? where.toLowerCase() : "before";
            el = el || {};
            var refNode = where == "before" ? this.dom: this.dom.nextSibling;
            if (typeof el == "object" && !el.nodeType && !el.dom) {
                if (where == "after" && !this.dom.nextSibling) {
                    rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom)
                } else {
                    rt = Ext.DomHelper[where == "after" ? "insertAfter": "insertBefore"](this.dom, el, !returnDom)
                }
            } else {
                rt = this.dom.parentNode.insertBefore(Ext.getDom(el), refNode);
                if (!returnDom) {
                    rt = Ext.get(rt)
                }
            }
            return rt
        },
        wrap: function(config, returnDom) {
            if (!config) {
                config = {
                    tag: "div"
                }
            }
            var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom);
            newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
            return newEl
        },
        replace: function(el) {
            el = Ext.get(el);
            this.insertBefore(el);
            el.remove();
            return this
        },
        replaceWith: function(el) {
            if (typeof el == "object" && !el.nodeType && !el.dom) {
                el = this.insertSibling(el, "before")
            } else {
                el = Ext.getDom(el);
                this.dom.parentNode.insertBefore(el, this.dom)
            }
            El.uncache(this.id);
            this.dom.parentNode.removeChild(this.dom);
            this.dom = el;
            this.id = Ext.id(el);
            El.cache[this.id] = this;
            return this
        },
        insertHtml: function(where, html, returnEl) {
            var el = Ext.DomHelper.insertHtml(where, this.dom, html);
            return returnEl ? Ext.get(el) : el
        },
        set: function(o, useSet) {
            var el = this.dom;
            useSet = typeof useSet == "undefined" ? (el.setAttribute ? true: false) : useSet;
            for (var attr in o) {
                if (attr == "style" || typeof o[attr] == "function") {
                    continue
                }
                if (attr == "cls") {
                    el.className = o["cls"]
                } else {
                    if (o.hasOwnProperty(attr)) {
                        if (useSet) {
                            el.setAttribute(attr, o[attr])
                        } else {
                            el[attr] = o[attr]
                        }
                    }
                }
            }
            if (o.style) {
                Ext.DomHelper.applyStyles(el, o.style)
            }
            return this
        },
        addKeyListener: function(key, fn, scope) {
            var config;
            if (typeof key != "object" || Ext.isArray(key)) {
                config = {
                    key: key,
                    fn: fn,
                    scope: scope
                }
            } else {
                config = {
                    key: key.key,
                    shift: key.shift,
                    ctrl: key.ctrl,
                    alt: key.alt,
                    fn: fn,
                    scope: scope
                }
            }
            return new Ext.KeyMap(this, config)
        },
        addKeyMap: function(config) {
            return new Ext.KeyMap(this, config)
        },
        isScrollable: function() {
            var dom = this.dom;
            return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth
        },
        scrollTo: function(side, value, animate) {
            var prop = side.toLowerCase() == "left" ? "scrollLeft": "scrollTop";
            if (!animate || !A) {
                this.dom[prop] = value
            } else {
                var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value];
                this.anim({
                    scroll: {
                        "to": to
                    }
                },
                this.preanim(arguments, 2), "scroll")
            }
            return this
        },
        scroll: function(direction, distance, animate) {
            if (!this.isScrollable()) {
                return
            }
            var el = this.dom;
            var l = el.scrollLeft,
            t = el.scrollTop;
            var w = el.scrollWidth,
            h = el.scrollHeight;
            var cw = el.clientWidth,
            ch = el.clientHeight;
            direction = direction.toLowerCase();
            var scrolled = false;
            var a = this.preanim(arguments, 2);
            switch (direction) {
            case "l":
            case "left":
                if (w - l > cw) {
                    var v = Math.min(l + distance, w - cw);
                    this.scrollTo("left", v, a);
                    scrolled = true
                }
                break;
            case "r":
            case "right":
                if (l > 0) {
                    var v = Math.max(l - distance, 0);
                    this.scrollTo("left", v, a);
                    scrolled = true
                }
                break;
            case "t":
            case "top":
            case "up":
                if (t > 0) {
                    var v = Math.max(t - distance, 0);
                    this.scrollTo("top", v, a);
                    scrolled = true
                }
                break;
            case "b":
            case "bottom":
            case "down":
                if (h - t > ch) {
                    var v = Math.min(t + distance, h - ch);
                    this.scrollTo("top", v, a);
                    scrolled = true
                }
                break
            }
            return scrolled
        },
        translatePoints: function(x, y) {
            if (typeof x == "object" || Ext.isArray(x)) {
                y = x[1];
                x = x[0]
            }
            var p = this.getStyle("position");
            var o = this.getXY();
            var l = parseInt(this.getStyle("left"), 10);
            var t = parseInt(this.getStyle("top"), 10);
            if (isNaN(l)) {
                l = (p == "relative") ? 0 : this.dom.offsetLeft
            }
            if (isNaN(t)) {
                t = (p == "relative") ? 0 : this.dom.offsetTop
            }
            return {
                left: (x - o[0] + l),
                top: (y - o[1] + t)
            }
        },
        getScroll: function() {
            var d = this.dom,
            doc = document;
            if (d == doc || d == doc.body) {
                var l, t;
                if (Ext.isIE && Ext.isStrict) {
                    l = doc.documentElement.scrollLeft || (doc.body.scrollLeft || 0);
                    t = doc.documentElement.scrollTop || (doc.body.scrollTop || 0)
                } else {
                    l = window.pageXOffset || (doc.body.scrollLeft || 0);
                    t = window.pageYOffset || (doc.body.scrollTop || 0)
                }
                return {
                    left: l,
                    top: t
                }
            } else {
                return {
                    left: d.scrollLeft,
                    top: d.scrollTop
                }
            }
        },
        getColor: function(attr, defaultValue, prefix) {
            var v = this.getStyle(attr);
            if (!v || v == "transparent" || v == "inherit") {
                return defaultValue
            }
            var color = typeof prefix == "undefined" ? "#": prefix;
            if (v.substr(0, 4) == "rgb(") {
                var rvs = v.slice(4, v.length - 1).split(",");
                for (var i = 0; i < 3; i++) {
                    var h = parseInt(rvs[i]);
                    var s = h.toString(16);
                    if (h < 16) {
                        s = "0" + s
                    }
                    color += s
                }
            } else {
                if (v.substr(0, 1) == "#") {
                    if (v.length == 4) {
                        for (var i = 1; i < 4; i++) {
                            var c = v.charAt(i);
                            color += c + c
                        }
                    } else {
                        if (v.length == 7) {
                            color += v.substr(1)
                        }
                    }
                }
            }
            return (color.length > 5 ? color.toLowerCase() : defaultValue)
        },
        boxWrap: function(cls) {
            cls = cls || "x-box";
            var el = Ext.get(this.insertHtml("beforeBegin", String.format("<div class=\"{0}\">" + El.boxMarkup + "</div>", cls)));
            el.child("." + cls + "-mc").dom.appendChild(this.dom);
            return el
        },
        getAttributeNS: Ext.isIE ?
        function(ns, name) {
            var d = this.dom;
            var type = typeof d[ns + ":" + name];
            if (type != "undefined" && type != "unknown") {
                return d[ns + ":" + name]
            }
            return d[name]
        }: function(ns, name) {
            var d = this.dom;
            return d.getAttributeNS(ns, name) || d.getAttribute(ns + ":" + name) || d.getAttribute(name) || d[name]
        },
        getTextWidth: function(text, min, max) {
            return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000)
        }
    };
    var ep = El.prototype;
    ep.on = ep.addListener;
    ep.mon = ep.addListener;
    ep.getUpdateManager = ep.getUpdater;
    ep.un = ep.removeListener;
    ep.autoBoxAdjust = true;
    El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;
    El.addUnits = function(v, defaultUnit) {
        if (v === "" || v == "auto") {
            return v
        }
        if (v === undefined) {
            return ""
        }
        if (typeof v == "number" || !El.unitPattern.test(v)) {
            return v + (defaultUnit || "px")
        }
        return v
    };
    El.boxMarkup = "<div class=\"{0}-tl\"><div class=\"{0}-tr\"><div class=\"{0}-tc\"></div></div></div><div class=\"{0}-ml\"><div class=\"{0}-mr\"><div class=\"{0}-mc\"></div></div></div><div class=\"{0}-bl\"><div class=\"{0}-br\"><div class=\"{0}-bc\"></div></div></div>";
    El.VISIBILITY = 1;
    El.DISPLAY = 2;
    El.borders = {
        l: "border-left-width",
        r: "border-right-width",
        t: "border-top-width",
        b: "border-bottom-width"
    };
    El.paddings = {
        l: "padding-left",
        r: "padding-right",
        t: "padding-top",
        b: "padding-bottom"
    };
    El.margins = {
        l: "margin-left",
        r: "margin-right",
        t: "margin-top",
        b: "margin-bottom"
    };
    El.cache = {};
    var docEl;
    El.get = function(el) {
        var ex, elm, id;
        if (!el) {
            return null
        }
        if (typeof el == "string") {
            if (! (elm = document.getElementById(el))) {
                return null
            }
            if (ex = El.cache[el]) {
                ex.dom = elm
            } else {
                ex = El.cache[el] = new El(elm)
            }
            return ex
        } else {
            if (el.tagName) {
                if (! (id = el.id)) {
                    id = Ext.id(el)
                }
                if (ex = El.cache[id]) {
                    ex.dom = el
                } else {
                    ex = El.cache[id] = new El(el)
                }
                return ex
            } else {
                if (el instanceof El) {
                    if (el != docEl) {
                        el.dom = document.getElementById(el.id) || el.dom;
                        El.cache[el.id] = el
                    }
                    return el
                } else {
                    if (el.isComposite) {
                        return el
                    } else {
                        if (Ext.isArray(el)) {
                            return El.select(el)
                        } else {
                            if (el == document) {
                                if (!docEl) {
                                    var f = function() {};
                                    f.prototype = El.prototype;
                                    docEl = new f();
                                    docEl.dom = document
                                }
                                return docEl
                            }
                        }
                    }
                }
            }
        }
        return null
    };
    El.uncache = function(el) {
        for (var i = 0, a = arguments, len = a.length; i < len; i++) {
            if (a[i]) {
                delete El.cache[a[i].id || a[i]]
            }
        }
    };
    El.garbageCollect = function() {
        if (!Ext.enableGarbageCollector) {
            clearInterval(El.collectorThread);
            return
        }
        for (var eid in El.cache) {
            var el = El.cache[eid],
            d = el.dom;
            if (!d || !d.parentNode || (!d.offsetParent && !document.getElementById(eid))) {
                delete El.cache[eid];
                if (d && Ext.enableListenerCollection) {
                    Ext.EventManager.removeAll(d)
                }
            }
        }
    };
    El.collectorThreadId = setInterval(El.garbageCollect, 30000);
    var flyFn = function() {};
    flyFn.prototype = El.prototype;
    var _cls = new flyFn();
    El.Flyweight = function(dom) {
        this.dom = dom
    };
    El.Flyweight.prototype = _cls;
    El.Flyweight.prototype.isFlyweight = true;
    El._flyweights = {};
    El.fly = function(el, named) {
        named = named || "_global";
        el = Ext.getDom(el);
        if (!el) {
            return null
        }
        if (!El._flyweights[named]) {
            El._flyweights[named] = new El.Flyweight()
        }
        El._flyweights[named].dom = el;
        return El._flyweights[named]
    };
    Ext.get = El.get;
    Ext.fly = El.fly;
    var noBoxAdjust = Ext.isStrict ? {
        select: 1
    }: {
        input: 1,
        select: 1,
        textarea: 1
    };
    if (Ext.isIE || Ext.isGecko) {
        noBoxAdjust["button"] = 1
    }
    Ext.EventManager.on(window, "unload",
    function() {
        delete El.cache;
        delete El._flyweights
    })
})();
Ext.enableFx = true;
Ext.Fx = {
    slideIn: function(A, C) {
        var B = this.getFxEl();
        C = C || {};
        B.queueFx(C,
        function() {
            A = A || "t";
            this.fixDisplay();
            var D = this.getFxRestore();
            var I = this.getBox();
            this.setSize(I);
            var F = this.fxWrap(D.pos, C, "hidden");
            var K = this.dom.style;
            K.visibility = "visible";
            K.position = "absolute";
            var E = function() {
                B.fxUnwrap(F, D.pos, C);
                K.width = D.width;
                K.height = D.height;
                B.afterFx(C)
            };
            var J, L = {
                to: [I.x, I.y]
            },
            H = {
                to: I.width
            },
            G = {
                to: I.height
            };
            switch (A.toLowerCase()) {
            case "t":
                F.setSize(I.width, 0);
                K.left = K.bottom = "0";
                J = {
                    height: G
                };
                break;
            case "l":
                F.setSize(0, I.height);
                K.right = K.top = "0";
                J = {
                    width: H
                };
                break;
            case "r":
                F.setSize(0, I.height);
                F.setX(I.right);
                K.left = K.top = "0";
                J = {
                    width: H,
                    points: L
                };
                break;
            case "b":
                F.setSize(I.width, 0);
                F.setY(I.bottom);
                K.left = K.top = "0";
                J = {
                    height: G,
                    points: L
                };
                break;
            case "tl":
                F.setSize(0, 0);
                K.right = K.bottom = "0";
                J = {
                    width: H,
                    height: G
                };
                break;
            case "bl":
                F.setSize(0, 0);
                F.setY(I.y + I.height);
                K.right = K.top = "0";
                J = {
                    width: H,
                    height: G,
                    points: L
                };
                break;
            case "br":
                F.setSize(0, 0);
                F.setXY([I.right, I.bottom]);
                K.left = K.top = "0";
                J = {
                    width: H,
                    height: G,
                    points: L
                };
                break;
            case "tr":
                F.setSize(0, 0);
                F.setX(I.x + I.width);
                K.left = K.bottom = "0";
                J = {
                    width: H,
                    height: G,
                    points: L
                };
                break
            }
            this.dom.style.visibility = "visible";
            F.show();
            arguments.callee.anim = F.fxanim(J, C, "motion", 0.5, "easeOut", E)
        });
        return this
    },
    slideOut: function(A, C) {
        var B = this.getFxEl();
        C = C || {};
        B.queueFx(C,
        function() {
            A = A || "t";
            var I = this.getFxRestore();
            var D = this.getBox();
            this.setSize(D);
            var G = this.fxWrap(I.pos, C, "visible");
            var F = this.dom.style;
            F.visibility = "visible";
            F.position = "absolute";
            G.setSize(D);
            var J = function() {
                if (C.useDisplay) {
                    B.setDisplayed(false)
                } else {
                    B.hide()
                }
                B.fxUnwrap(G, I.pos, C);
                F.width = I.width;
                F.height = I.height;
                B.afterFx(C)
            };
            var E, H = {
                to: 0
            };
            switch (A.toLowerCase()) {
            case "t":
                F.left = F.bottom = "0";
                E = {
                    height: H
                };
                break;
            case "l":
                F.right = F.top = "0";
                E = {
                    width: H
                };
                break;
            case "r":
                F.left = F.top = "0";
                E = {
                    width: H,
                    points: {
                        to: [D.right, D.y]
                    }
                };
                break;
            case "b":
                F.left = F.top = "0";
                E = {
                    height: H,
                    points: {
                        to: [D.x, D.bottom]
                    }
                };
                break;
            case "tl":
                F.right = F.bottom = "0";
                E = {
                    width: H,
                    height: H
                };
                break;
            case "bl":
                F.right = F.top = "0";
                E = {
                    width: H,
                    height: H,
                    points: {
                        to: [D.x, D.bottom]
                    }
                };
                break;
            case "br":
                F.left = F.top = "0";
                E = {
                    width: H,
                    height: H,
                    points: {
                        to: [D.x + D.width, D.bottom]
                    }
                };
                break;
            case "tr":
                F.left = F.bottom = "0";
                E = {
                    width: H,
                    height: H,
                    points: {
                        to: [D.right, D.y]
                    }
                };
                break
            }
            arguments.callee.anim = G.fxanim(E, C, "motion", 0.5, "easeOut", J)
        });
        return this
    },
    puff: function(B) {
        var A = this.getFxEl();
        B = B || {};
        A.queueFx(B,
        function() {
            this.clearOpacity();
            this.show();
            var F = this.getFxRestore();
            var D = this.dom.style;
            var G = function() {
                if (B.useDisplay) {
                    A.setDisplayed(false)
                } else {
                    A.hide()
                }
                A.clearOpacity();
                A.setPositioning(F.pos);
                D.width = F.width;
                D.height = F.height;
                D.fontSize = "";
                A.afterFx(B)
            };
            var E = this.getWidth();
            var C = this.getHeight();
            arguments.callee.anim = this.fxanim({
                width: {
                    to: this.adjustWidth(E * 2)
                },
                height: {
                    to: this.adjustHeight(C * 2)
                },
                points: {
                    by: [ - (E * 0.5), -(C * 0.5)]
                },
                opacity: {
                    to: 0
                },
                fontSize: {
                    to: 200,
                    unit: "%"
                }
            },
            B, "motion", 0.5, "easeOut", G)
        });
        return this
    },
    switchOff: function(B) {
        var A = this.getFxEl();
        B = B || {};
        A.queueFx(B,
        function() {
            this.clearOpacity();
            this.clip();
            var D = this.getFxRestore();
            var C = this.dom.style;
            var E = function() {
                if (B.useDisplay) {
                    A.setDisplayed(false)
                } else {
                    A.hide()
                }
                A.clearOpacity();
                A.setPositioning(D.pos);
                C.width = D.width;
                C.height = D.height;
                A.afterFx(B)
            };
            this.fxanim({
                opacity: {
                    to: 0.3
                }
            },
            null, null, 0.1, null,
            function() {
                this.clearOpacity();
                (function() {
                    this.fxanim({
                        height: {
                            to: 1
                        },
                        points: {
                            by: [0, this.getHeight() * 0.5]
                        }
                    },
                    B, "motion", 0.3, "easeIn", E)
                }).defer(100, this)
            })
        });
        return this
    },
    highlight: function(A, C) {
        var B = this.getFxEl();
        C = C || {};
        B.queueFx(C,
        function() {
            A = A || "ffff9c";
            var D = C.attr || "backgroundColor";
            this.clearOpacity();
            this.show();
            var G = this.getColor(D);
            var H = this.dom.style[D];
            var F = (C.endColor || G) || "ffffff";
            var I = function() {
                B.dom.style[D] = H;
                B.afterFx(C)
            };
            var E = {};
            E[D] = {
                from: A,
                to: F
            };
            arguments.callee.anim = this.fxanim(E, C, "color", 1, "easeIn", I)
        });
        return this
    },
    frame: function(A, C, D) {
        var B = this.getFxEl();
        D = D || {};
        B.queueFx(D,
        function() {
            A = A || "#C3DAF9";
            if (A.length == 6) {
                A = "#" + A
            }
            C = C || 1;
            var G = D.duration || 1;
            this.show();
            var E = this.getBox();
            var F = function() {
                var H = Ext.getBody().createChild({
                    style: {
                        visbility: "hidden",
                        position: "absolute",
                        "z-index": "35000",
                        border: "0px solid " + A
                    }
                });
                var I = Ext.isBorderBox ? 2 : 1;
                H.animate({
                    top: {
                        from: E.y,
                        to: E.y - 20
                    },
                    left: {
                        from: E.x,
                        to: E.x - 20
                    },
                    borderWidth: {
                        from: 0,
                        to: 10
                    },
                    opacity: {
                        from: 1,
                        to: 0
                    },
                    height: {
                        from: E.height,
                        to: (E.height + (20 * I))
                    },
                    width: {
                        from: E.width,
                        to: (E.width + (20 * I))
                    }
                },
                G,
                function() {
                    H.remove();
                    if (--C > 0) {
                        F()
                    } else {
                        B.afterFx(D)
                    }
                })
            };
            F.call(this)
        });
        return this
    },
    pause: function(C) {
        var A = this.getFxEl();
        var B = {};
        A.queueFx(B,
        function() {
            setTimeout(function() {
                A.afterFx(B)
            },
            C * 1000)
        });
        return this
    },
    fadeIn: function(B) {
        var A = this.getFxEl();
        B = B || {};
        A.queueFx(B,
        function() {
            this.setOpacity(0);
            this.fixDisplay();
            this.dom.style.visibility = "visible";
            var C = B.endOpacity || 1;
            arguments.callee.anim = this.fxanim({
                opacity: {
                    to: C
                }
            },
            B, null, 0.5, "easeOut",
            function() {
                if (C == 1) {
                    this.clearOpacity()
                }
                A.afterFx(B)
            })
        });
        return this
    },
    fadeOut: function(B) {
        var A = this.getFxEl();
        B = B || {};
        A.queueFx(B,
        function() {
            arguments.callee.anim = this.fxanim({
                opacity: {
                    to: B.endOpacity || 0
                }
            },
            B, null, 0.5, "easeOut",
            function() {
                if (this.visibilityMode == Ext.Element.DISPLAY || B.useDisplay) {
                    this.dom.style.display = "none"
                } else {
                    this.dom.style.visibility = "hidden"
                }
                this.clearOpacity();
                A.afterFx(B)
            })
        });
        return this
    },
    scale: function(A, B, C) {
        this.shift(Ext.apply({},
        C, {
            width: A,
            height: B
        }));
        return this
    },
    shift: function(B) {
        var A = this.getFxEl();
        B = B || {};
        A.queueFx(B,
        function() {
            var E = {},
            D = B.width,
            F = B.height,
            C = B.x,
            H = B.y,
            G = B.opacity;
            if (D !== undefined) {
                E.width = {
                    to: this.adjustWidth(D)
                }
            }
            if (F !== undefined) {
                E.height = {
                    to: this.adjustHeight(F)
                }
            }
            if (B.left !== undefined) {
                E.left = {
                    to: B.left
                }
            }
            if (B.top !== undefined) {
                E.top = {
                    to: B.top
                }
            }
            if (B.right !== undefined) {
                E.right = {
                    to: B.right
                }
            }
            if (B.bottom !== undefined) {
                E.bottom = {
                    to: B.bottom
                }
            }
            if (C !== undefined || H !== undefined) {
                E.points = {
                    to: [C !== undefined ? C: this.getX(), H !== undefined ? H: this.getY()]
                }
            }
            if (G !== undefined) {
                E.opacity = {
                    to: G
                }
            }
            if (B.xy !== undefined) {
                E.points = {
                    to: B.xy
                }
            }
            arguments.callee.anim = this.fxanim(E, B, "motion", 0.35, "easeOut",
            function() {
                A.afterFx(B)
            })
        });
        return this
    },
    ghost: function(A, C) {
        var B = this.getFxEl();
        C = C || {};
        B.queueFx(C,
        function() {
            A = A || "b";
            var H = this.getFxRestore();
            var E = this.getWidth(),
            G = this.getHeight();
            var F = this.dom.style;
            var J = function() {
                if (C.useDisplay) {
                    B.setDisplayed(false)
                } else {
                    B.hide()
                }
                B.clearOpacity();
                B.setPositioning(H.pos);
                F.width = H.width;
                F.height = H.height;
                B.afterFx(C)
            };
            var D = {
                opacity: {
                    to: 0
                },
                points: {}
            },
            I = D.points;
            switch (A.toLowerCase()) {
            case "t":
                I.by = [0, -G];
                break;
            case "l":
                I.by = [ - E, 0];
                break;
            case "r":
                I.by = [E, 0];
                break;
            case "b":
                I.by = [0, G];
                break;
            case "tl":
                I.by = [ - E, -G];
                break;
            case "bl":
                I.by = [ - E, G];
                break;
            case "br":
                I.by = [E, G];
                break;
            case "tr":
                I.by = [E, -G];
                break
            }
            arguments.callee.anim = this.fxanim(D, C, "motion", 0.5, "easeOut", J)
        });
        return this
    },
    syncFx: function() {
        this.fxDefaults = Ext.apply(this.fxDefaults || {},
        {
            block: false,
            concurrent: true,
            stopFx: false
        });
        return this
    },
    sequenceFx: function() {
        this.fxDefaults = Ext.apply(this.fxDefaults || {},
        {
            block: false,
            concurrent: false,
            stopFx: false
        });
        return this
    },
    nextFx: function() {
        var A = this.fxQueue[0];
        if (A) {
            A.call(this)
        }
    },
    hasActiveFx: function() {
        return this.fxQueue && this.fxQueue[0]
    },
    stopFx: function() {
        if (this.hasActiveFx()) {
            var A = this.fxQueue[0];
            if (A && A.anim && A.anim.isAnimated()) {
                this.fxQueue = [A];
                A.anim.stop(true)
            }
        }
        return this
    },
    beforeFx: function(A) {
        if (this.hasActiveFx() && !A.concurrent) {
            if (A.stopFx) {
                this.stopFx();
                return true
            }
            return false
        }
        return true
    },
    hasFxBlock: function() {
        var A = this.fxQueue;
        return A && A[0] && A[0].block
    },
    queueFx: function(C, A) {
        if (!this.fxQueue) {
            this.fxQueue = []
        }
        if (!this.hasFxBlock()) {
            Ext.applyIf(C, this.fxDefaults);
            if (!C.concurrent) {
                var B = this.beforeFx(C);
                A.block = C.block;
                this.fxQueue.push(A);
                if (B) {
                    this.nextFx()
                }
            } else {
                A.call(this)
            }
        }
        return this
    },
    fxWrap: function(F, D, C) {
        var B;
        if (!D.wrap || !(B = Ext.get(D.wrap))) {
            var A;
            if (D.fixPosition) {
                A = this.getXY()
            }
            var E = document.createElement("div");
            E.style.visibility = C;
            B = Ext.get(this.dom.parentNode.insertBefore(E, this.dom));
            B.setPositioning(F);
            if (B.getStyle("position") == "static") {
                B.position("relative")
            }
            this.clearPositioning("auto");
            B.clip();
            B.dom.appendChild(this.dom);
            if (A) {
                B.setXY(A)
            }
        }
        return B
    },
    fxUnwrap: function(A, C, B) {
        this.clearPositioning();
        this.setPositioning(C);
        if (!B.wrap) {
            A.dom.parentNode.insertBefore(this.dom, A.dom);
            A.remove()
        }
    },
    getFxRestore: function() {
        var A = this.dom.style;
        return {
            pos: this.getPositioning(),
            width: A.width,
            height: A.height
        }
    },
    afterFx: function(A) {
        if (A.afterStyle) {
            this.applyStyles(A.afterStyle)
        }
        if (A.afterCls) {
            this.addClass(A.afterCls)
        }
        if (A.remove === true) {
            this.remove()
        }
        Ext.callback(A.callback, A.scope, [this]);
        if (!A.concurrent) {
            this.fxQueue.shift();
            this.nextFx()
        }
    },
    getFxEl: function() {
        return Ext.get(this.dom)
    },
    fxanim: function(D, E, B, F, C, A) {
        B = B || "run";
        E = E || {};
        var G = Ext.lib.Anim[B](this.dom, D, (E.duration || F) || 0.35, (E.easing || C) || "easeOut",
        function() {
            Ext.callback(A, this)
        },
        this);
        E.anim = G;
        return G
    }
};
Ext.Fx.resize = Ext.Fx.scale;
Ext.apply(Ext.Element.prototype, Ext.Fx);
Ext.CompositeElement = function(A) {
    this.elements = [];
    this.addElements(A)
};
Ext.CompositeElement.prototype = {
    isComposite: true,
    addElements: function(E) {
        if (!E) {
            return this
        }
        if (typeof E == "string") {
            E = Ext.Element.selectorFunction(E)
        }
        var D = this.elements;
        var B = D.length - 1;
        for (var C = 0, A = E.length; C < A; C++) {
            D[++B] = Ext.get(E[C])
        }
        return this
    },
    fill: function(A) {
        this.elements = [];
        this.add(A);
        return this
    },
    filter: function(A) {
        var B = [];
        this.each(function(C) {
            if (C.is(A)) {
                B[B.length] = C.dom
            }
        });
        this.fill(B);
        return this
    },
    invoke: function(E, B) {
        var D = this.elements;
        for (var C = 0, A = D.length; C < A; C++) {
            Ext.Element.prototype[E].apply(D[C], B)
        }
        return this
    },
    add: function(A) {
        if (typeof A == "string") {
            this.addElements(Ext.Element.selectorFunction(A))
        } else {
            if (A.length !== undefined) {
                this.addElements(A)
            } else {
                this.addElements([A])
            }
        }
        return this
    },
    each: function(E, D) {
        var C = this.elements;
        for (var B = 0, A = C.length; B < A; B++) {
            if (E.call(D || C[B], C[B], this, B) === false) {
                break
            }
        }
        return this
    },
    item: function(A) {
        return this.elements[A] || null
    },
    first: function() {
        return this.item(0)
    },
    last: function() {
        return this.item(this.elements.length - 1)
    },
    getCount: function() {
        return this.elements.length
    },
    contains: function(A) {
        return this.indexOf(A) !== -1
    },
    indexOf: function(A) {
        return this.elements.indexOf(Ext.get(A))
    },
    removeElement: function(D, F) {
        if (Ext.isArray(D)) {
            for (var C = 0, A = D.length; C < A; C++) {
                this.removeElement(D[C])
            }
            return this
        }
        var B = typeof D == "number" ? D: this.indexOf(D);
        if (B !== -1 && this.elements[B]) {
            if (F) {
                var E = this.elements[B];
                if (E.dom) {
                    E.remove()
                } else {
                    Ext.removeNode(E)
                }
            }
            this.elements.splice(B, 1)
        }
        return this
    },
    replaceElement: function(D, C, A) {
        var B = typeof D == "number" ? D: this.indexOf(D);
        if (B !== -1) {
            if (A) {
                this.elements[B].replaceWith(C)
            } else {
                this.elements.splice(B, 1, Ext.get(C))
            }
        }
        return this
    },
    clear: function() {
        this.elements = []
    }
};
(function() {
    Ext.CompositeElement.createCall = function(B, C) {
        if (!B[C]) {
            B[C] = function() {
                return this.invoke(C, arguments)
            }
        }
    };
    for (var A in Ext.Element.prototype) {
        if (typeof Ext.Element.prototype[A] == "function") {
            Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, A)
        }
    }
})();
Ext.CompositeElementLite = function(A) {
    Ext.CompositeElementLite.superclass.constructor.call(this, A);
    this.el = new Ext.Element.Flyweight()
};
Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {
    addElements: function(E) {
        if (E) {
            if (Ext.isArray(E)) {
                this.elements = this.elements.concat(E)
            } else {
                var D = this.elements;
                var B = D.length - 1;
                for (var C = 0, A = E.length; C < A; C++) {
                    D[++B] = E[C]
                }
            }
        }
        return this
    },
    invoke: function(F, B) {
        var D = this.elements;
        var E = this.el;
        for (var C = 0, A = D.length; C < A; C++) {
            E.dom = D[C];
            Ext.Element.prototype[F].apply(E, B)
        }
        return this
    },
    item: function(A) {
        if (!this.elements[A]) {
            return null
        }
        this.el.dom = this.elements[A];
        return this.el
    },
    addListener: function(B, G, F, E) {
        var D = this.elements;
        for (var C = 0, A = D.length; C < A; C++) {
            Ext.EventManager.on(D[C], B, G, F || D[C], E)
        }
        return this
    },
    each: function(F, E) {
        var C = this.elements;
        var D = this.el;
        for (var B = 0, A = C.length; B < A; B++) {
            D.dom = C[B];
            if (F.call(E || D, D, this, B) === false) {
                break
            }
        }
        return this
    },
    indexOf: function(A) {
        return this.elements.indexOf(Ext.getDom(A))
    },
    replaceElement: function(D, C, A) {
        var B = typeof D == "number" ? D: this.indexOf(D);
        if (B !== -1) {
            C = Ext.getDom(C);
            if (A) {
                var E = this.elements[B];
                E.parentNode.insertBefore(C, E);
                Ext.removeNode(E)
            }
            this.elements.splice(B, 1, C)
        }
        return this
    }
});
Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
if (Ext.DomQuery) {
    Ext.Element.selectorFunction = Ext.DomQuery.select
}
Ext.Element.select = function(A, D, B) {
    var C;
    if (typeof A == "string") {
        C = Ext.Element.selectorFunction(A, B)
    } else {
        if (A.length !== undefined) {
            C = A
        } else {
            throw "Invalid selector"
        }
    }
    if (D === true) {
        return new Ext.CompositeElement(C)
    } else {
        return new Ext.CompositeElementLite(C)
    }
};
Ext.select = Ext.Element.select;
Ext.data.Connection = function(A) {
    Ext.apply(this, A);
    this.addEvents("beforerequest", "requestcomplete", "requestexception");
    Ext.data.Connection.superclass.constructor.call(this)
};
Ext.extend(Ext.data.Connection, Ext.util.Observable, {
    timeout: 30000,
    autoAbort: false,
    disableCaching: true,
    disableCachingParam: "_dc",
    request: function(E) {
        if (this.fireEvent("beforerequest", this, E) !== false) {
            var C = E.params;
            if (typeof C == "function") {
                C = C.call(E.scope || window, E)
            }
            if (typeof C == "object") {
                C = Ext.urlEncode(C)
            }
            if (this.extraParams) {
                var G = Ext.urlEncode(this.extraParams);
                C = C ? (C + "&" + G) : G
            }
            var B = E.url || this.url;
            if (typeof B == "function") {
                B = B.call(E.scope || window, E)
            }
            if (E.form) {
                var D = Ext.getDom(E.form);
                B = B || D.action;
                var J = D.getAttribute("enctype");
                if (E.isUpload || (J && J.toLowerCase() == "multipart/form-data")) {
                    return this.doFormUpload(E, C, B)
                }
                var I = Ext.lib.Ajax.serializeForm(D);
                C = C ? (C + "&" + I) : I
            }
            var K = E.headers;
            if (this.defaultHeaders) {
                K = Ext.apply(K || {},
                this.defaultHeaders);
                if (!E.headers) {
                    E.headers = K
                }
            }
            var F = {
                success: this.handleResponse,
                failure: this.handleFailure,
                scope: this,
                argument: {
                    options: E
                },
                timeout: E.timeout || this.timeout
            };
            var A = E.method || this.method || ((C || E.xmlData || E.jsonData) ? "POST": "GET");
            if (A == "GET" && (this.disableCaching && E.disableCaching !== false) || E.disableCaching === true) {
                var H = E.disableCachingParam || this.disableCachingParam;
                B += (B.indexOf("?") != -1 ? "&": "?") + H + "=" + (new Date().getTime())
            }
            if (typeof E.autoAbort == "boolean") {
                if (E.autoAbort) {
                    this.abort()
                }
            } else {
                if (this.autoAbort !== false) {
                    this.abort()
                }
            }
            if ((A == "GET" || E.xmlData || E.jsonData) && C) {
                B += (B.indexOf("?") != -1 ? "&": "?") + C;
                C = ""
            }
            this.transId = Ext.lib.Ajax.request(A, B, F, C, E);
            return this.transId
        } else {
            Ext.callback(E.callback, E.scope, [E, null, null]);
            return null
        }
    },
    isLoading: function(A) {
        if (A) {
            return Ext.lib.Ajax.isCallInProgress(A)
        } else {
            return this.transId ? true: false
        }
    },
    abort: function(A) {
        if (A || this.isLoading()) {
            Ext.lib.Ajax.abort(A || this.transId)
        }
    },
    handleResponse: function(A) {
        this.transId = false;
        var B = A.argument.options;
        A.argument = B ? B.argument: null;
        this.fireEvent("requestcomplete", this, A, B);
        Ext.callback(B.success, B.scope, [A, B]);
        Ext.callback(B.callback, B.scope, [B, true, A])
    },
    handleFailure: function(A, C) {
        this.transId = false;
        var B = A.argument.options;
        A.argument = B ? B.argument: null;
        this.fireEvent("requestexception", this, A, B, C);
        Ext.callback(B.failure, B.scope, [A, B]);
        Ext.callback(B.callback, B.scope, [B, false, A])
    },
    doFormUpload: function(E, A, B) {
        var C = Ext.id();
        var F = document.createElement("iframe");
        F.id = C;
        F.name = C;
        F.className = "x-hidden";
        if (Ext.isIE) {
            F.src = Ext.SSL_SECURE_URL
        }
        document.body.appendChild(F);
        if (Ext.isIE) {
            document.frames[C].name = C
        }
        var D = Ext.getDom(E.form);
        D.target = C;
        D.method = "POST";
        D.enctype = D.encoding = "multipart/form-data";
        if (B) {
            D.action = B
        }
        var L, J;
        if (A) {
            L = [];
            A = Ext.urlDecode(A, false);
            for (var H in A) {
                if (A.hasOwnProperty(H)) {
                    J = document.createElement("input");
                    J.type = "hidden";
                    J.name = H;
                    J.value = A[H];
                    D.appendChild(J);
                    L.push(J)
                }
            }
        }
        function G() {
            var M = {
                responseText: "",
                responseXML: null
            };
            M.argument = E ? E.argument: null;
            try {
                var O;
                if (Ext.isIE) {
                    O = F.contentWindow.document
                } else {
                    O = (F.contentDocument || window.frames[C].document)
                }
                if (O && O.body) {
                    M.responseText = O.body.innerHTML
                }
                if (O && O.XMLDocument) {
                    M.responseXML = O.XMLDocument
                } else {
                    M.responseXML = O
                }
            } catch(N) {}
            Ext.EventManager.removeListener(F, "load", G, this);
            this.fireEvent("requestcomplete", this, M, E);
            Ext.callback(E.success, E.scope, [M, E]);
            Ext.callback(E.callback, E.scope, [E, true, M]);
            setTimeout(function() {
                Ext.removeNode(F)
            },
            100)
        }
        Ext.EventManager.on(F, "load", G, this);
        D.submit();
        if (L) {
            for (var I = 0, K = L.length; I < K; I++) {
                Ext.removeNode(L[I])
            }
        }
    }
});
Ext.Ajax = new Ext.data.Connection({
    autoAbort: false,
    serializeForm: function(A) {
        return Ext.lib.Ajax.serializeForm(A)
    }
});
Ext.Updater = Ext.extend(Ext.util.Observable, {
    constructor: function(B, A) {
        B = Ext.get(B);
        if (!A && B.updateManager) {
            return B.updateManager
        }
        this.el = B;
        this.defaultUrl = null;
        this.addEvents("beforeupdate", "update", "failure");
        var C = Ext.Updater.defaults;
        this.sslBlankUrl = C.sslBlankUrl;
        this.disableCaching = C.disableCaching;
        this.indicatorText = C.indicatorText;
        this.showLoadIndicator = C.showLoadIndicator;
        this.timeout = C.timeout;
        this.loadScripts = C.loadScripts;
        this.transaction = null;
        this.refreshDelegate = this.refresh.createDelegate(this);
        this.updateDelegate = this.update.createDelegate(this);
        this.formUpdateDelegate = this.formUpdate.createDelegate(this);
        if (!this.renderer) {
            this.renderer = this.getDefaultRenderer()
        }
        Ext.Updater.superclass.constructor.call(this)
    },
    getDefaultRenderer: function() {
        return new Ext.Updater.BasicRenderer()
    },
    getEl: function() {
        return this.el
    },
    update: function(B, F, G, D) {
        if (this.fireEvent("beforeupdate", this.el, B, F) !== false) {
            var A, C;
            if (typeof B == "object") {
                A = B;
                B = A.url;
                F = F || A.params;
                G = G || A.callback;
                D = D || A.discardUrl;
                C = A.scope;
                if (typeof A.nocache != "undefined") {
                    this.disableCaching = A.nocache
                }
                if (typeof A.text != "undefined") {
                    this.indicatorText = "<div class=\"loading-indicator\">" + A.text + "</div>"
                }
                if (typeof A.scripts != "undefined") {
                    this.loadScripts = A.scripts
                }
                if (typeof A.timeout != "undefined") {
                    this.timeout = A.timeout
                }
            }
            this.showLoading();
            if (!D) {
                this.defaultUrl = B
            }
            if (typeof B == "function") {
                B = B.call(this)
            }
            var E = Ext.apply({},
            {
                url: B,
                params: (typeof F == "function" && C) ? F.createDelegate(C) : F,
                success: this.processSuccess,
                failure: this.processFailure,
                scope: this,
                callback: undefined,
                timeout: (this.timeout * 1000),
                disableCaching: this.disableCaching,
                argument: {
                    "options": A,
                    "url": B,
                    "form": null,
                    "callback": G,
                    "scope": C || window,
                    "params": F
                }
            },
            A);
            this.transaction = Ext.Ajax.request(E)
        }
    },
    formUpdate: function(C, A, B, D) {
        if (this.fireEvent("beforeupdate", this.el, C, A) !== false) {
            if (typeof A == "function") {
                A = A.call(this)
            }
            C = Ext.getDom(C);
            this.transaction = Ext.Ajax.request({
                form: C,
                url: A,
                success: this.processSuccess,
                failure: this.processFailure,
                scope: this,
                timeout: (this.timeout * 1000),
                argument: {
                    "url": A,
                    "form": C,
                    "callback": D,
                    "reset": B
                }
            });
            this.showLoading.defer(1, this)
        }
    },
    refresh: function(A) {
        if (this.defaultUrl == null) {
            return
        }
        this.update(this.defaultUrl, null, A, true)
    },
    startAutoRefresh: function(B, C, D, E, A) {
        if (A) {
            this.update(C || this.defaultUrl, D, E, true)
        }
        if (this.autoRefreshProcId) {
            clearInterval(this.autoRefreshProcId)
        }
        this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [C || this.defaultUrl, D, E, true]), B * 1000)
    },
    stopAutoRefresh: function() {
        if (this.autoRefreshProcId) {
            clearInterval(this.autoRefreshProcId);
            delete this.autoRefreshProcId
        }
    },
    isAutoRefreshing: function() {
        return this.autoRefreshProcId ? true: false
    },
    showLoading: function() {
        if (this.showLoadIndicator) {
            this.el.update(this.indicatorText)
        }
    },
    processSuccess: function(A) {
        this.transaction = null;
        if (A.argument.form && A.argument.reset) {
            try {
                A.argument.form.reset()
            } catch(B) {}
        }
        if (this.loadScripts) {
            this.renderer.render(this.el, A, this, this.updateComplete.createDelegate(this, [A]))
        } else {
            this.renderer.render(this.el, A, this);
            this.updateComplete(A)
        }
    },
    updateComplete: function(A) {
        this.fireEvent("update", this.el, A);
        if (typeof A.argument.callback == "function") {
            A.argument.callback.call(A.argument.scope, this.el, true, A, A.argument.options)
        }
    },
    processFailure: function(A) {
        this.transaction = null;
        this.fireEvent("failure", this.el, A);
        if (typeof A.argument.callback == "function") {
            A.argument.callback.call(A.argument.scope, this.el, false, A, A.argument.options)
        }
    },
    setRenderer: function(A) {
        this.renderer = A
    },
    getRenderer: function() {
        return this.renderer
    },
    setDefaultUrl: function(A) {
        this.defaultUrl = A
    },
    abort: function() {
        if (this.transaction) {
            Ext.Ajax.abort(this.transaction)
        }
    },
    isUpdating: function() {
        if (this.transaction) {
            return Ext.Ajax.isLoading(this.transaction)
        }
        return false
    }
});
Ext.Updater.defaults = {
    timeout: 30,
    loadScripts: false,
    sslBlankUrl: (Ext.SSL_SECURE_URL || "javascript:false"),
    disableCaching: false,
    showLoadIndicator: true,
    indicatorText: "<div class=\"loading-indicator\">Loading...</div>"
};
Ext.Updater.updateElement = function(D, C, E, B) {
    var A = Ext.get(D).getUpdater();
    Ext.apply(A, B);
    A.update(C, E, B ? B.callback: null)
};
Ext.Updater.BasicRenderer = function() {};
Ext.Updater.BasicRenderer.prototype = {
    render: function(C, A, B, D) {
        C.update(A.responseText, B.loadScripts, D)
    }
};
Ext.UpdateManager = Ext.Updater;
(function() {
    Date.formatCodeToRegex = function(character, currentGroup) {
        var p = Date.parseCodes[character];
        if (p) {
            p = Ext.type(p) == "function" ? p() : p;
            Date.parseCodes[character] = p
        }
        return p ? Ext.applyIf({
            c: p.c ? String.format(p.c, currentGroup || "{0}") : p.c
        },
        p) : {
            g: 0,
            c: null,
            s: Ext.escapeRe(character)
        }
    };
    var $f = Date.formatCodeToRegex;
    Ext.apply(Date, {
        parseFunctions: {
            count: 0
        },
        parseRegexes: [],
        formatFunctions: {
            count: 0
        },
        daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        y2kYear: 50,
        MILLI: "ms",
        SECOND: "s",
        MINUTE: "mi",
        HOUR: "h",
        DAY: "d",
        MONTH: "mo",
        YEAR: "y",
        dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
        monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
        monthNumbers: {
            Jan: 0,
            Feb: 1,
            Mar: 2,
            Apr: 3,
            May: 4,
            Jun: 5,
            Jul: 6,
            Aug: 7,
            Sep: 8,
            Oct: 9,
            Nov: 10,
            Dec: 11
        },
        getShortMonthName: function(month) {
            return Date.monthNames[month].substring(0, 3)
        },
        getShortDayName: function(day) {
            return Date.dayNames[day].substring(0, 3)
        },
        getMonthNumber: function(name) {
            return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()]
        },
        formatCodes: {
            d: "String.leftPad(this.getDate(), 2, '0')",
            D: "Date.getShortDayName(this.getDay())",
            j: "this.getDate()",
            l: "Date.dayNames[this.getDay()]",
            N: "(this.getDay() ? this.getDay() : 7)",
            S: "this.getSuffix()",
            w: "this.getDay()",
            z: "this.getDayOfYear()",
            W: "String.leftPad(this.getWeekOfYear(), 2, '0')",
            F: "Date.monthNames[this.getMonth()]",
            m: "String.leftPad(this.getMonth() + 1, 2, '0')",
            M: "Date.getShortMonthName(this.getMonth())",
            n: "(this.getMonth() + 1)",
            t: "this.getDaysInMonth()",
            L: "(this.isLeapYear() ? 1 : 0)",
            o: "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",
            Y: "this.getFullYear()",
            y: "('' + this.getFullYear()).substring(2, 4)",
            a: "(this.getHours() < 12 ? 'am' : 'pm')",
            A: "(this.getHours() < 12 ? 'AM' : 'PM')",
            g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
            G: "this.getHours()",
            h: "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
            H: "String.leftPad(this.getHours(), 2, '0')",
            i: "String.leftPad(this.getMinutes(), 2, '0')",
            s: "String.leftPad(this.getSeconds(), 2, '0')",
            u: "String.leftPad(this.getMilliseconds(), 3, '0')",
            O: "this.getGMTOffset()",
            P: "this.getGMTOffset(true)",
            T: "this.getTimezone()",
            Z: "(this.getTimezoneOffset() * -60)",
            c: function() {
                for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {
                    var e = c.charAt(i);
                    code.push(e == "T" ? "'T'": Date.getFormatCode(e))
                }
                return code.join(" + ")
            },
            U: "Math.round(this.getTime() / 1000)"
        },
        parseDate: function(input, format) {
            var p = Date.parseFunctions;
            if (p[format] == null) {
                Date.createParser(format)
            }
            var func = p[format];
            return Date[func](input)
        },
        getFormatCode: function(character) {
            var f = Date.formatCodes[character];
            if (f) {
                f = Ext.type(f) == "function" ? f() : f;
                Date.formatCodes[character] = f
            }
            return f || ("'" + String.escape(character) + "'")
        },
        createNewFormat: function(format) {
            var funcName = "format" + Date.formatFunctions.count++;
            Date.formatFunctions[format] = funcName;
            var code = "Date.prototype." + funcName + " = function(){return ";
            var special = false;
            var ch = "";
            for (var i = 0; i < format.length; ++i) {
                ch = format.charAt(i);
                if (!special && ch == "\\") {
                    special = true
                } else {
                    if (special) {
                        special = false;
                        code += "'" + String.escape(ch) + "' + "
                    } else {
                        code += Date.getFormatCode(ch) + " + "
                    }
                }
            }
            eval(code.substring(0, code.length - 3) + ";}")
        },
        createParser: function(format) {
            var funcName = "parse" + Date.parseFunctions.count++;
            var regexNum = Date.parseRegexes.length;
            var currentGroup = 1;
            Date.parseFunctions[format] = funcName;
            var code = "Date." + funcName + " = function(input){\n" + "var y, m, d, h = 0, i = 0, s = 0, ms = 0, o, z, u, v;\n" + "input = String(input);\n" + "d = new Date();\n" + "y = d.getFullYear();\n" + "m = d.getMonth();\n" + "d = d.getDate();\n" + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n" + "if (results && results.length > 0) {";
            var regex = "";
            var special = false;
            var ch = "";
            for (var i = 0; i < format.length; ++i) {
                ch = format.charAt(i);
                if (!special && ch == "\\") {
                    special = true
                } else {
                    if (special) {
                        special = false;
                        regex += String.escape(ch)
                    } else {
                        var obj = Date.formatCodeToRegex(ch, currentGroup);
                        currentGroup += obj.g;
                        regex += obj.s;
                        if (obj.g && obj.c) {
                            code += obj.c
                        }
                    }
                }
            }
            code += "if (u){\n" + "v = new Date(u * 1000);\n" + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0){\n" + "v = new Date(y, m, d, h, i, s, ms);\n" + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0){\n" + "v = new Date(y, m, d, h, i, s);\n" + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0){\n" + "v = new Date(y, m, d, h, i);\n" + "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0){\n" + "v = new Date(y, m, d, h);\n" + "}else if (y >= 0 && m >= 0 && d > 0){\n" + "v = new Date(y, m, d);\n" + "}else if (y >= 0 && m >= 0){\n" + "v = new Date(y, m);\n" + "}else if (y >= 0){\n" + "v = new Date(y);\n" + "}\n}\nreturn (v && (z || o))?" + " (Ext.type(z) == 'number' ? v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - z) :" + " v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn))) : v;\n" + "}";
            Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$", "i");
            eval(code)
        },
        parseCodes: {
            d: {
                g: 1,
                c: "d = parseInt(results[{0}], 10);\n",
                s: "(\\d{2})"
            },
            j: {
                g: 1,
                c: "d = parseInt(results[{0}], 10);\n",
                s: "(\\d{1,2})"
            },
            D: function() {
                for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i) {}
                return {
                    g: 0,
                    c: null,
                    s: "(?:" + a.join("|") + ")"
                }
            },
            l: function() {
                return {
                    g: 0,
                    c: null,
                    s: "(?:" + Date.dayNames.join("|") + ")"
                }
            },
            N: {
                g: 0,
                c: null,
                s: "[1-7]"
            },
            S: {
                g: 0,
                c: null,
                s: "(?:st|nd|rd|th)"
            },
            w: {
                g: 0,
                c: null,
                s: "[0-6]"
            },
            z: {
                g: 0,
                c: null,
                s: "(?:\\d{1,3}"
            },
            W: {
                g: 0,
                c: null,
                s: "(?:\\d{2})"
            },
            F: function() {
                return {
                    g: 1,
                    c: "m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",
                    s: "(" + Date.monthNames.join("|") + ")"
                }
            },
            M: function() {
                for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i) {}
                return Ext.applyIf({
                    s: "(" + a.join("|") + ")"
                },
                $f("F"))
            },
            m: {
                g: 1,
                c: "m = parseInt(results[{0}], 10) - 1;\n",
                s: "(\\d{2})"
            },
            n: {
                g: 1,
                c: "m = parseInt(results[{0}], 10) - 1;\n",
                s: "(\\d{1,2})"
            },
            t: {
                g: 0,
                c: null,
                s: "(?:\\d{2})"
            },
            L: {
                g: 0,
                c: null,
                s: "(?:1|0)"
            },
            o: function() {
                return $f("Y")
            },
            Y: {
                g: 1,
                c: "y = parseInt(results[{0}], 10);\n",
                s: "(\\d{4})"
            },
            y: {
                g: 1,
                c: "var ty = parseInt(results[{0}], 10);\n" + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
                s: "(\\d{1,2})"
            },
            a: {
                g: 1,
                c: "if (results[{0}] == 'am') {\n" + "if (h == 12) { h = 0; }\n" + "} else { if (h < 12) { h += 12; }}",
                s: "(am|pm)"
            },
            A: {
                g: 1,
                c: "if (results[{0}] == 'AM') {\n" + "if (h == 12) { h = 0; }\n" + "} else { if (h < 12) { h += 12; }}",
                s: "(AM|PM)"
            },
            g: function() {
                return $f("G")
            },
            G: {
                g: 1,
                c: "h = parseInt(results[{0}], 10);\n",
                s: "(\\d{1,2})"
            },
            h: function() {
                return $f("H")
            },
            H: {
                g: 1,
                c: "h = parseInt(results[{0}], 10);\n",
                s: "(\\d{2})"
            },
            i: {
                g: 1,
                c: "i = parseInt(results[{0}], 10);\n",
                s: "(\\d{2})"
            },
            s: {
                g: 1,
                c: "s = parseInt(results[{0}], 10);\n",
                s: "(\\d{2})"
            },
            u: {
                g: 1,
                c: "ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
                s: "(\\d+)"
            },
            O: {
                g: 1,
                c: ["o = results[{0}];", "var sn = o.substring(0,1);", "var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);", "var mn = o.substring(3,5) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),
                s: "([+-]\\d{4})"
            },
            P: {
                g: 1,
                c: ["o = results[{0}];", "var sn = o.substring(0,1);", "var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);", "var mn = o.substring(4,6) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),
                s: "([+-]\\d{2}:\\d{2})"
            },
            T: {
                g: 0,
                c: null,
                s: "[A-Z]{1,4}"
            },
            Z: {
                g: 1,
                c: "z = results[{0}] * 1;\n" + "z = (-43200 <= z && z <= 50400)? z : null;\n",
                s: "([+-]?\\d{1,5})"
            },
            c: function() {
                var calc = [];
                var arr = [$f("Y", 1), $f("m", 2), $f("d", 3), $f("h", 4), $f("i", 5), $f("s", 6), {
                    c: "ms = (results[7] || '.0').substring(1); ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"
                },
                {
                    c: "if(results[9] == 'Z'){\no = 0;\n}else{\n" + $f("P", 9).c + "\n}"
                }];
                for (var i = 0, l = arr.length; i < l; ++i) {
                    calc.push(arr[i].c)
                }
                return {
                    g: 1,
                    c: calc.join(""),
                    s: arr[0].s + "-" + arr[1].s + "-" + arr[2].s + "T" + arr[3].s + ":" + arr[4].s + ":" + arr[5].s + "((.|,)\\d+)?" + "(" + $f("P", null).s + "|Z)"
                }
            },
            U: {
                g: 1,
                c: "u = parseInt(results[{0}], 10);\n",
                s: "(-?\\d+)"
            }
        }
    })
} ());
Ext.override(Date, {
    dateFormat: function(B) {
        if (Date.formatFunctions[B] == null) {
            Date.createNewFormat(B)
        }
        var A = Date.formatFunctions[B];
        return this[A]()
    },
    getTimezone: function() {
        return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "")
    },
    getGMTOffset: function(A) {
        return (this.getTimezoneOffset() > 0 ? "-": "+") + String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0") + (A ? ":": "") + String.leftPad(Math.abs(this.getTimezoneOffset() % 60), 2, "0")
    },
    getDayOfYear: function() {
        var A = 0;
        Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
        for (var B = 0; B < this.getMonth(); ++B) {
            A += Date.daysInMonth[B]
        }
        return A + this.getDate() - 1
    },
    getWeekOfYear: function() {
        var B = 86400000;
        var C = 7 * B;
        var D = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / B;
        var A = Math.floor(D / 7);
        var E = new Date(A * C).getUTCFullYear();
        return A - Math.floor(Date.UTC(E, 0, 7) / C) + 1
    },
    isLeapYear: function() {
        var A = this.getFullYear();
        return !! ((A & 3) == 0 && (A % 100 || (A % 400 == 0 && A)))
    },
    getFirstDayOfMonth: function() {
        var A = (this.getDay() - (this.getDate() - 1)) % 7;
        return (A < 0) ? (A + 7) : A
    },
    getLastDayOfMonth: function() {
        var A = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
        return (A < 0) ? (A + 7) : A
    },
    getFirstDateOfMonth: function() {
        return new Date(this.getFullYear(), this.getMonth(), 1)
    },
    getLastDateOfMonth: function() {
        return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth())
    },
    getDaysInMonth: function() {
        Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
        return Date.daysInMonth[this.getMonth()]
    },
    getSuffix: function() {
        switch (this.getDate()) {
        case 1:
        case 21:
        case 31:
            return "st";
        case 2:
        case 22:
            return "nd";
        case 3:
        case 23:
            return "rd";
        default:
            return "th"
        }
    },
    clone: function() {
        return new Date(this.getTime())
    },
    clearTime: function(A) {
        if (A) {
            return this.clone().clearTime()
        }
        this.setHours(0);
        this.setMinutes(0);
        this.setSeconds(0);
        this.setMilliseconds(0);
        return this
    },
    add: function(B, C) {
        var D = this.clone();
        if (!B || C === 0) {
            return D
        }
        switch (B.toLowerCase()) {
        case Date.MILLI:
            D.setMilliseconds(this.getMilliseconds() + C);
            break;
        case Date.SECOND:
            D.setSeconds(this.getSeconds() + C);
            break;
        case Date.MINUTE:
            D.setMinutes(this.getMinutes() + C);
            break;
        case Date.HOUR:
            D.setHours(this.getHours() + C);
            break;
        case Date.DAY:
            D.setDate(this.getDate() + C);
            break;
        case Date.MONTH:
            var A = this.getDate();
            if (A > 28) {
                A = Math.min(A, this.getFirstDateOfMonth().add("mo", C).getLastDateOfMonth().getDate())
            }
            D.setDate(A);
            D.setMonth(this.getMonth() + C);
            break;
        case Date.YEAR:
            D.setFullYear(this.getFullYear() + C);
            break
        }
        return D
    },
    between: function(C, A) {
        var B = this.getTime();
        return C.getTime() <= B && B <= A.getTime()
    }
});
Date.prototype.format = Date.prototype.dateFormat;
if (Ext.isSafari) {
    Date.brokenSetMonth = Date.prototype.setMonth;
    Date.prototype.setMonth = function(A) {
        if (A <= -1) {
            var D = Math.ceil( - A);
            var C = Math.ceil(D / 12);
            var B = (D % 12) ? 12 - D % 12 : 0;
            this.setFullYear(this.getFullYear() - C);
            return Date.brokenSetMonth.call(this, B)
        } else {
            return Date.brokenSetMonth.apply(this, arguments)
        }
    }
};
Ext.util.DelayedTask = function(E, D, A) {
    var G = null,
    F, B;
    var C = function() {
        var H = new Date().getTime();
        if (H - B >= F) {
            clearInterval(G);
            G = null;
            E.apply(D, A || [])
        }
    };
    this.delay = function(I, K, J, H) {
        if (G && I != F) {
            this.cancel()
        }
        F = I;
        B = new Date().getTime();
        E = K || E;
        D = J || D;
        A = H || A;
        if (!G) {
            G = setInterval(C, F)
        }
    };
    this.cancel = function() {
        if (G) {
            clearInterval(G);
            G = null
        }
    }
};
Ext.util.TaskRunner = function(E) {
    E = E || 10;
    var F = [],
    A = [];
    var B = 0;
    var G = false;
    var D = function() {
        G = false;
        clearInterval(B);
        B = 0
    };
    var H = function() {
        if (!G) {
            G = true;
            B = setInterval(I, E)
        }
    };
    var C = function(J) {
        A.push(J);
        if (J.onStop) {
            J.onStop.apply(J.scope || J)
        }
    };
    var I = function() {
        if (A.length > 0) {
            for (var O = 0, K = A.length; O < K; O++) {
                F.remove(A[O])
            }
            A = [];
            if (F.length < 1) {
                D();
                return
            }
        }
        var M = new Date().getTime();
        for (var O = 0, K = F.length; O < K; ++O) {
            var N = F[O];
            var J = M - N.taskRunTime;
            if (N.interval <= J) {
                var L = N.run.apply(N.scope || N, N.args || [++N.taskRunCount]);
                N.taskRunTime = M;
                if (L === false || N.taskRunCount === N.repeat) {
                    C(N);
                    return
                }
            }
            if (N.duration && N.duration <= (M - N.taskStartTime)) {
                C(N)
            }
        }
    };
    this.start = function(J) {
        F.push(J);
        J.taskStartTime = new Date().getTime();
        J.taskRunTime = 0;
        J.taskRunCount = 0;
        H();
        return J
    };
    this.stop = function(J) {
        C(J);
        return J
    };
    this.stopAll = function() {
        D();
        for (var K = 0, J = F.length; K < J; K++) {
            if (F[K].onStop) {
                F[K].onStop()
            }
        }
        F = [];
        A = []
    }
};
Ext.TaskMgr = new Ext.util.TaskRunner();
Ext.util.MixedCollection = function(B, A) {
    this.items = [];
    this.map = {};
    this.keys = [];
    this.length = 0;
    this.addEvents("clear", "add", "replace", "remove", "sort");
    this.allowFunctions = B === true;
    if (A) {
        this.getKey = A
    }
    Ext.util.MixedCollection.superclass.constructor.call(this)
};
Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {
    allowFunctions: false,
    add: function(B, C) {
        if (arguments.length == 1) {
            C = arguments[0];
            B = this.getKey(C)
        }
        if (typeof B == "undefined" || B === null) {
            this.length++;
            this.items.push(C);
            this.keys.push(null)
        } else {
            var A = this.map[B];
            if (A) {
                return this.replace(B, C)
            }
            this.length++;
            this.items.push(C);
            this.map[B] = C;
            this.keys.push(B)
        }
        this.fireEvent("add", this.length - 1, C, B);
        return C
    },
    getKey: function(A) {
        return A.id
    },
    replace: function(C, D) {
        if (arguments.length == 1) {
            D = arguments[0];
            C = this.getKey(D)
        }
        var A = this.item(C);
        if (typeof C == "undefined" || C === null || typeof A == "undefined") {
            return this.add(C, D)
        }
        var B = this.indexOfKey(C);
        this.items[B] = D;
        this.map[C] = D;
        this.fireEvent("replace", C, A, D);
        return D
    },
    addAll: function(E) {
        if (arguments.length > 1 || Ext.isArray(E)) {
            var B = arguments.length > 1 ? arguments: E;
            for (var D = 0, A = B.length; D < A; D++) {
                this.add(B[D])
            }
        } else {
            for (var C in E) {
                if (this.allowFunctions || typeof E[C] != "function") {
                    this.add(C, E[C])
                }
            }
        }
    },
    each: function(E, D) {
        var B = [].concat(this.items);
        for (var C = 0, A = B.length; C < A; C++) {
            if (E.call(D || B[C], B[C], C, A) === false) {
                break
            }
        }
    },
    eachKey: function(D, C) {
        for (var B = 0, A = this.keys.length; B < A; B++) {
            D.call(C || window, this.keys[B], this.items[B], B, A)
        }
    },
    find: function(D, C) {
        for (var B = 0, A = this.items.length; B < A; B++) {
            if (D.call(C || window, this.items[B], this.keys[B])) {
                return this.items[B]
            }
        }
        return null
    },
    insert: function(A, B, C) {
        if (arguments.length == 2) {
            C = arguments[1];
            B = this.getKey(C)
        }
        if (A >= this.length) {
            return this.add(B, C)
        }
        this.length++;
        this.items.splice(A, 0, C);
        if (typeof B != "undefined" && B != null) {
            this.map[B] = C
        }
        this.keys.splice(A, 0, B);
        this.fireEvent("add", A, C, B);
        return C
    },
    remove: function(A) {
        return this.removeAt(this.indexOf(A))
    },
    removeAt: function(A) {
        if (A < this.length && A >= 0) {
            this.length--;
            var C = this.items[A];
            this.items.splice(A, 1);
            var B = this.keys[A];
            if (typeof B != "undefined") {
                delete this.map[B]
            }
            this.keys.splice(A, 1);
            this.fireEvent("remove", C, B);
            return C
        }
        return false
    },
    removeKey: function(A) {
        return this.removeAt(this.indexOfKey(A))
    },
    getCount: function() {
        return this.length
    },
    indexOf: function(A) {
        return this.items.indexOf(A)
    },
    indexOfKey: function(A) {
        return this.keys.indexOf(A)
    },
    item: function(A) {
        var B = typeof this.map[A] != "undefined" ? this.map[A] : this.items[A];
        return typeof B != "function" || this.allowFunctions ? B: null
    },
    itemAt: function(A) {
        return this.items[A]
    },
    key: function(A) {
        return this.map[A]
    },
    contains: function(A) {
        return this.indexOf(A) != -1
    },
    containsKey: function(A) {
        return typeof this.map[A] != "undefined"
    },
    clear: function() {
        this.length = 0;
        this.items = [];
        this.keys = [];
        this.map = {};
        this.fireEvent("clear")
    },
    first: function() {
        return this.items[0]
    },
    last: function() {
        return this.items[this.length - 1]
    },
    _sort: function(I, A, H) {
        var C = String(A).toUpperCase() == "DESC" ? -1 : 1;
        H = H ||
        function(K, J) {
            return K - J
        };
        var G = [],
        B = this.keys,
        F = this.items;
        for (var D = 0, E = F.length; D < E; D++) {
            G[G.length] = {
                key: B[D],
                value: F[D],
                index: D
            }
        }
        G.sort(function(K, J) {
            var L = H(K[I], J[I]) * C;
            if (L == 0) {
                L = (K.index < J.index ? -1 : 1)
            }
            return L
        });
        for (var D = 0, E = G.length; D < E; D++) {
            F[D] = G[D].value;
            B[D] = G[D].key
        }
        this.fireEvent("sort", this)
    },
    sort: function(A, B) {
        this._sort("value", A, B)
    },
    keySort: function(A, B) {
        this._sort("key", A, B ||
        function(D, C) {
            return String(D).toUpperCase() - String(C).toUpperCase()
        })
    },
    getRange: function(E, A) {
        var B = this.items;
        if (B.length < 1) {
            return []
        }
        E = E || 0;
        A = Math.min(typeof A == "undefined" ? this.length - 1 : A, this.length - 1);
        var D = [];
        if (E <= A) {
            for (var C = E; C <= A; C++) {
                D[D.length] = B[C]
            }
        } else {
            for (var C = E; C >= A; C--) {
                D[D.length] = B[C]
            }
        }
        return D
    },
    filter: function(C, B, D, A) {
        if (Ext.isEmpty(B, false)) {
            return this.clone()
        }
        B = this.createValueMatcher(B, D, A);
        return this.filterBy(function(E) {
            return E && B.test(E[C])
        })
    },
    filterBy: function(F, E) {
        var G = new Ext.util.MixedCollection();
        G.getKey = this.getKey;
        var B = this.keys,
        D = this.items;
        for (var C = 0, A = D.length; C < A; C++) {
            if (F.call(E || this, D[C], B[C])) {
                G.add(B[C], D[C])
            }
        }
        return G
    },
    findIndex: function(C, B, E, D, A) {
        if (Ext.isEmpty(B, false)) {
            return - 1
        }
        B = this.createValueMatcher(B, D, A);
        return this.findIndexBy(function(F) {
            return F && B.test(F[C])
        },
        null, E)
    },
    findIndexBy: function(F, E, G) {
        var B = this.keys,
        D = this.items;
        for (var C = (G || 0), A = D.length; C < A; C++) {
            if (F.call(E || this, D[C], B[C])) {
                return C
            }
        }
        if (typeof G == "number" && G > 0) {
            for (var C = 0; C < G; C++) {
                if (F.call(E || this, D[C], B[C])) {
                    return C
                }
            }
        }
        return - 1
    },
    createValueMatcher: function(B, C, A) {
        if (!B.exec) {
            B = String(B);
            B = new RegExp((C === true ? "": "^") + Ext.escapeRe(B), A ? "": "i")
        }
        return B
    },
    clone: function() {
        var E = new Ext.util.MixedCollection();
        var B = this.keys,
        D = this.items;
        for (var C = 0, A = D.length; C < A; C++) {
            E.add(B[C], D[C])
        }
        E.getKey = this.getKey;
        return E
    }
});
Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
Ext.util.JSON = new(function() {
    var useHasOwn = !!{}.hasOwnProperty;
    var pad = function(n) {
        return n < 10 ? "0" + n: n
    };
    var m = {
        "\b": "\\b",
        "\t": "\\t",
        "\n": "\\n",
        "\f": "\\f",
        "\r": "\\r",
        "\"": "\\\"",
        "\\": "\\\\"
    };
    var encodeString = function(s) {
        if (/["\\\x00-\x1f]/.test(s)) {
            return "\"" + s.replace(/([\x00-\x1f\\"])/g,
            function(a, b) {
                var c = m[b];
                if (c) {
                    return c
                }
                c = b.charCodeAt();
                return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16)
            }) + "\""
        }
        return "\"" + s + "\""
    };
    var encodeArray = function(o) {
        var a = ["["],
        b,
        i,
        l = o.length,
        v;
        for (i = 0; i < l; i += 1) {
            v = o[i];
            switch (typeof v) {
            case "undefined":
            case "function":
            case "unknown":
                break;
            default:
                if (b) {
                    a.push(",")
                }
                a.push(v === null ? "null": Ext.util.JSON.encode(v));
                b = true
            }
        }
        a.push("]");
        return a.join("")
    };
    this.encodeDate = function(o) {
        return "\"" + o.getFullYear() + "-" + pad(o.getMonth() + 1) + "-" + pad(o.getDate()) + "T" + pad(o.getHours()) + ":" + pad(o.getMinutes()) + ":" + pad(o.getSeconds()) + "\""
    };
    this.encode = function(o) {
        if (typeof o == "undefined" || o === null) {
            return "null"
        } else {
            if (Ext.isArray(o)) {
                return encodeArray(o)
            } else {
                if (Ext.isDate(o)) {
                    return Ext.util.JSON.encodeDate(o)
                } else {
                    if (typeof o == "string") {
                        return encodeString(o)
                    } else {
                        if (typeof o == "number") {
                            return isFinite(o) ? String(o) : "null"
                        } else {
                            if (typeof o == "boolean") {
                                return String(o)
                            } else {
                                var a = ["{"],
                                b,
                                i,
                                v;
                                for (i in o) {
                                    if (!useHasOwn || o.hasOwnProperty(i)) {
                                        v = o[i];
                                        switch (typeof v) {
                                        case "undefined":
                                        case "function":
                                        case "unknown":
                                            break;
                                        default:
                                            if (b) {
                                                a.push(",")
                                            }
                                            a.push(this.encode(i), ":", v === null ? "null": this.encode(v));
                                            b = true
                                        }
                                    }
                                }
                                a.push("}");
                                return a.join("")
                            }
                        }
                    }
                }
            }
        }
    };
    this.decode = function(json) {
        return eval("(" + json + ")")
    }
})();
Ext.encode = Ext.util.JSON.encode;
Ext.decode = Ext.util.JSON.decode;
Ext.util.Format = function() {
    var trimRe = /^\s+|\s+$/g;
    return {
        ellipsis: function(value, len) {
            if (value && value.length > len) {
                return value.substr(0, len - 3) + "..."
            }
            return value
        },
        undef: function(value) {
            return value !== undefined ? value: ""
        },
        defaultValue: function(value, defaultValue) {
            return value !== undefined && value !== "" ? value: defaultValue
        },
        htmlEncode: function(value) {
            return ! value ? value: String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;")
        },
        htmlDecode: function(value) {
            return ! value ? value: String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, "\"").replace(/&amp;/g, "&")
        },
        trim: function(value) {
            return String(value).replace(trimRe, "")
        },
        substr: function(value, start, length) {
            return String(value).substr(start, length)
        },
        lowercase: function(value) {
            return String(value).toLowerCase()
        },
        uppercase: function(value) {
            return String(value).toUpperCase()
        },
        capitalize: function(value) {
            return ! value ? value: value.charAt(0).toUpperCase() + value.substr(1).toLowerCase()
        },
        call: function(value, fn) {
            if (arguments.length > 2) {
                var args = Array.prototype.slice.call(arguments, 2);
                args.unshift(value);
                return eval(fn).apply(window, args)
            } else {
                return eval(fn).call(window, value)
            }
        },
        usMoney: function(v) {
            v = (Math.round((v - 0) * 100)) / 100;
            v = (v == Math.floor(v)) ? v + ".00": ((v * 10 == Math.floor(v * 10)) ? v + "0": v);
            v = String(v);
            var ps = v.split(".");
            var whole = ps[0];
            var sub = ps[1] ? "." + ps[1] : ".00";
            var r = /(\d+)(\d{3})/;
            while (r.test(whole)) {
                whole = whole.replace(r, "$1" + "," + "$2")
            }
            v = whole + sub;
            if (v.charAt(0) == "-") {
                return "-$" + v.substr(1)
            }
            return "$" + v
        },
        date: function(v, format) {
            if (!v) {
                return ""
            }
            if (!Ext.isDate(v)) {
                v = new Date(Date.parse(v))
            }
            return v.dateFormat(format || "m/d/Y")
        },
        dateRenderer: function(format) {
            return function(v) {
                return Ext.util.Format.date(v, format)
            }
        },
        stripTagsRE: /<\/?[^>]+>/gi,
        stripTags: function(v) {
            return ! v ? v: String(v).replace(this.stripTagsRE, "")
        },
        stripScriptsRe: /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
        stripScripts: function(v) {
            return ! v ? v: String(v).replace(this.stripScriptsRe, "")
        },
        fileSize: function(size) {
            if (size < 1024) {
                return size + " bytes"
            } else {
                if (size < 1048576) {
                    return (Math.round(((size * 10) / 1024)) / 10) + " KB"
                } else {
                    return (Math.round(((size * 10) / 1048576)) / 10) + " MB"
                }
            }
        },
        math: function() {
            var fns = {};
            return function(v, a) {
                if (!fns[a]) {
                    fns[a] = new Function("v", "return v " + a + ";")
                }
                return fns[a](v)
            }
        } (),
        nl2br: function(v) {
            return v === undefined || v === null ? "": v.replace(/\n/g, "<br/>")
        }
    }
} ();
Ext.XTemplate = function() {
    Ext.XTemplate.superclass.constructor.apply(this, arguments);
    var P = this.html;
    P = ["<tpl>", P, "</tpl>"].join("");
    var O = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;
    var N = /^<tpl\b[^>]*?for="(.*?)"/;
    var L = /^<tpl\b[^>]*?if="(.*?)"/;
    var J = /^<tpl\b[^>]*?exec="(.*?)"/;
    var C, B = 0;
    var G = [];
    while (C = P.match(O)) {
        var M = C[0].match(N);
        var K = C[0].match(L);
        var I = C[0].match(J);
        var E = null,
        H = null,
        D = null;
        var A = M && M[1] ? M[1] : "";
        if (K) {
            E = K && K[1] ? K[1] : null;
            if (E) {
                H = new Function("values", "parent", "xindex", "xcount", "with(values){ return " + (Ext.util.Format.htmlDecode(E)) + "; }")
            }
        }
        if (I) {
            E = I && I[1] ? I[1] : null;
            if (E) {
                D = new Function("values", "parent", "xindex", "xcount", "with(values){ " + (Ext.util.Format.htmlDecode(E)) + "; }")
            }
        }
        if (A) {
            switch (A) {
            case ".":
                A = new Function("values", "parent", "with(values){ return values; }");
                break;
            case "..":
                A = new Function("values", "parent", "with(values){ return parent; }");
                break;
            default:
                A = new Function("values", "parent", "with(values){ return " + A + "; }")
            }
        }
        G.push({
            id: B,
            target: A,
            exec: D,
            test: H,
            body: C[1] || ""
        });
        P = P.replace(C[0], "{xtpl" + B + "}"); ++B
    }
    for (var F = G.length - 1; F >= 0; --F) {
        this.compileTpl(G[F])
    }
    this.master = G[G.length - 1];
    this.tpls = G
};
Ext.extend(Ext.XTemplate, Ext.Template, {
    re: /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
    codeRe: /\{\[((?:\\\]|.|\n)*?)\]\}/g,
    applySubTemplate: function(A, H, G, D, C) {
        var J = this.tpls[A];
        if (J.test && !J.test.call(this, H, G, D, C)) {
            return ""
        }
        if (J.exec && J.exec.call(this, H, G, D, C)) {
            return ""
        }
        var I = J.target ? J.target.call(this, H, G) : H;
        G = J.target ? H: G;
        if (J.target && Ext.isArray(I)) {
            var B = [];
            for (var E = 0, F = I.length; E < F; E++) {
                B[B.length] = J.compiled.call(this, I[E], G, E + 1, F)
            }
            return B.join("")
        }
        return J.compiled.call(this, I, G, D, C)
    },
    compileTpl: function(tpl) {
        var fm = Ext.util.Format;
        var useF = this.disableFormats !== true;
        var sep = Ext.isGecko ? "+": ",";
        var fn = function(m, name, format, args, math) {
            if (name.substr(0, 4) == "xtpl") {
                return "'" + sep + "this.applySubTemplate(" + name.substr(4) + ", values, parent, xindex, xcount)" + sep + "'"
            }
            var v;
            if (name === ".") {
                v = "values"
            } else {
                if (name === "#") {
                    v = "xindex"
                } else {
                    if (name.indexOf(".") != -1) {
                        v = name
                    } else {
                        v = "values['" + name + "']"
                    }
                }
            }
            if (math) {
                v = "(" + v + math + ")"
            }
            if (format && useF) {
                args = args ? "," + args: "";
                if (format.substr(0, 5) != "this.") {
                    format = "fm." + format + "("
                } else {
                    format = "this.call(\"" + format.substr(5) + "\", ";
                    args = ", values"
                }
            } else {
                args = "";
                format = "(" + v + " === undefined ? '' : "
            }
            return "'" + sep + format + v + args + ")" + sep + "'"
        };
        var codeFn = function(m, code) {
            return "'" + sep + "(" + code + ")" + sep + "'"
        };
        var body;
        if (Ext.isGecko) {
            body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" + tpl.body.replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) + "';};"
        } else {
            body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];
            body.push(tpl.body.replace(/(\r\n|\n)/g, "\\n").replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn));
            body.push("'].join('');};");
            body = body.join("")
        }
        eval(body);
        return this
    },
    applyTemplate: function(A) {
        return this.master.compiled.call(this, A, {},
        1, 1)
    },
    compile: function() {
        return this
    }
});
Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;
Ext.XTemplate.from = function(A) {
    A = Ext.getDom(A);
    return new Ext.XTemplate(A.value || A.innerHTML)
};
Ext.util.CSS = function() {
    var D = null;
    var C = document;
    var B = /(-[a-z])/gi;
    var A = function(E, F) {
        return F.charAt(1).toUpperCase()
    };
    return {
        createStyleSheet: function(G, J) {
            var F;
            var E = C.getElementsByTagName("head")[0];
            var I = C.createElement("style");
            I.setAttribute("type", "text/css");
            if (J) {
                I.setAttribute("id", J)
            }
            if (Ext.isIE) {
                E.appendChild(I);
                F = I.styleSheet;
                F.cssText = G
            } else {
                try {
                    I.appendChild(C.createTextNode(G))
                } catch(H) {
                    I.cssText = G
                }
                E.appendChild(I);
                F = I.styleSheet ? I.styleSheet: (I.sheet || C.styleSheets[C.styleSheets.length - 1])
            }
            this.cacheStyleSheet(F);
            return F
        },
        removeStyleSheet: function(F) {
            var E = C.getElementById(F);
            if (E) {
                E.parentNode.removeChild(E)
            }
        },
        swapStyleSheet: function(G, E) {
            this.removeStyleSheet(G);
            var F = C.createElement("link");
            F.setAttribute("rel", "stylesheet");
            F.setAttribute("type", "text/css");
            F.setAttribute("id", G);
            F.setAttribute("href", E);
            C.getElementsByTagName("head")[0].appendChild(F)
        },
        refreshCache: function() {
            return this.getRules(true)
        },
        cacheStyleSheet: function(F) {
            if (!D) {
                D = {}
            }
            try {
                var H = F.cssRules || F.rules;
                for (var E = H.length - 1; E >= 0; --E) {
                    D[H[E].selectorText] = H[E]
                }
            } catch(G) {}
        },
        getRules: function(F) {
            if (D == null || F) {
                D = {};
                var H = C.styleSheets;
                for (var G = 0, E = H.length; G < E; G++) {
                    try {
                        this.cacheStyleSheet(H[G])
                    } catch(I) {}
                }
            }
            return D
        },
        getRule: function(E, G) {
            var F = this.getRules(G);
            if (!Ext.isArray(E)) {
                return F[E]
            }
            for (var H = 0; H < E.length; H++) {
                if (F[E[H]]) {
                    return F[E[H]]
                }
            }
            return null
        },
        updateRule: function(E, H, G) {
            if (!Ext.isArray(E)) {
                var I = this.getRule(E);
                if (I) {
                    I.style[H.replace(B, A)] = G;
                    return true
                }
            } else {
                for (var F = 0; F < E.length; F++) {
                    if (this.updateRule(E[F], H, G)) {
                        return true
                    }
                }
            }
            return false
        }
    }
} ();
Ext.util.ClickRepeater = function(B, A) {
    this.el = Ext.get(B);
    this.el.unselectable();
    Ext.apply(this, A);
    this.addEvents("mousedown", "click", "mouseup");
    this.el.on("mousedown", this.handleMouseDown, this);
    if (this.preventDefault || this.stopDefault) {
        this.el.on("click",
        function(C) {
            if (this.preventDefault) {
                C.preventDefault()
            }
            if (this.stopDefault) {
                C.stopEvent()
            }
        },
        this)
    }
    if (this.handler) {
        this.on("click", this.handler, this.scope || this)
    }
    Ext.util.ClickRepeater.superclass.constructor.call(this)
};
Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, {
    interval: 20,
    delay: 250,
    preventDefault: true,
    stopDefault: false,
    timer: 0,
    handleMouseDown: function() {
        clearTimeout(this.timer);
        this.el.blur();
        if (this.pressClass) {
            this.el.addClass(this.pressClass)
        }
        this.mousedownTime = new Date();
        Ext.getDoc().on("mouseup", this.handleMouseUp, this);
        this.el.on("mouseout", this.handleMouseOut, this);
        this.fireEvent("mousedown", this);
        this.fireEvent("click", this);
        if (this.accelerate) {
            this.delay = 400
        }
        this.timer = this.click.defer(this.delay || this.interval, this)
    },
    click: function() {
        this.fireEvent("click", this);
        this.timer = this.click.defer(this.accelerate ? this.easeOutExpo(this.mousedownTime.getElapsed(), 400, -390, 12000) : this.interval, this)
    },
    easeOutExpo: function(B, A, D, C) {
        return (B == C) ? A + D: D * ( - Math.pow(2, -10 * B / C) + 1) + A
    },
    handleMouseOut: function() {
        clearTimeout(this.timer);
        if (this.pressClass) {
            this.el.removeClass(this.pressClass)
        }
        this.el.on("mouseover", this.handleMouseReturn, this)
    },
    handleMouseReturn: function() {
        this.el.un("mouseover", this.handleMouseReturn, this);
        if (this.pressClass) {
            this.el.addClass(this.pressClass)
        }
        this.click()
    },
    handleMouseUp: function() {
        clearTimeout(this.timer);
        this.el.un("mouseover", this.handleMouseReturn, this);
        this.el.un("mouseout", this.handleMouseOut, this);
        Ext.getDoc().un("mouseup", this.handleMouseUp, this);
        this.el.removeClass(this.pressClass);
        this.fireEvent("mouseup", this)
    }
});
Ext.KeyNav = function(B, A) {
    this.el = Ext.get(B);
    Ext.apply(this, A);
    if (!this.disabled) {
        this.disabled = true;
        this.enable()
    }
};
Ext.KeyNav.prototype = {
    disabled: false,
    defaultEventAction: "stopEvent",
    forceKeyDown: false,
    prepareEvent: function(C) {
        var A = C.getKey();
        var B = this.keyToHandler[A];
        if (Ext.isSafari2 && B && A >= 37 && A <= 40) {
            C.stopEvent()
        }
    },
    relay: function(C) {
        var A = C.getKey();
        var B = this.keyToHandler[A];
        if (B && this[B]) {
            if (this.doRelay(C, this[B], B) !== true) {
                C[this.defaultEventAction]()
            }
        }
    },
    doRelay: function(C, B, A) {
        return B.call(this.scope || this, C)
    },
    enter: false,
    left: false,
    right: false,
    up: false,
    down: false,
    tab: false,
    esc: false,
    pageUp: false,
    pageDown: false,
    del: false,
    home: false,
    end: false,
    keyToHandler: {
        37 : "left",
        39 : "right",
        38 : "up",
        40 : "down",
        33 : "pageUp",
        34 : "pageDown",
        46 : "del",
        36 : "home",
        35 : "end",
        13 : "enter",
        27 : "esc",
        9 : "tab"
    },
    enable: function() {
        if (this.disabled) {
            if (this.forceKeyDown || Ext.isIE || Ext.isSafari3 || Ext.isAir) {
                this.el.on("keydown", this.relay, this)
            } else {
                this.el.on("keydown", this.prepareEvent, this);
                this.el.on("keypress", this.relay, this)
            }
            this.disabled = false
        }
    },
    disable: function() {
        if (!this.disabled) {
            if (this.forceKeyDown || Ext.isIE || Ext.isSafari3 || Ext.isAir) {
                this.el.un("keydown", this.relay)
            } else {
                this.el.un("keydown", this.prepareEvent);
                this.el.un("keypress", this.relay)
            }
            this.disabled = true
        }
    }
};
Ext.KeyMap = function(C, B, A) {
    this.el = Ext.get(C);
    this.eventName = A || "keydown";
    this.bindings = [];
    if (B) {
        this.addBinding(B)
    }
    this.enable()
};
Ext.KeyMap.prototype = {
    stopEvent: false,
    addBinding: function(D) {
        if (Ext.isArray(D)) {
            for (var F = 0, H = D.length; F < H; F++) {
                this.addBinding(D[F])
            }
            return
        }
        var N = D.key,
        C = D.shift,
        A = D.ctrl,
        G = D.alt,
        J = D.fn || D.handler,
        M = D.scope;
        if (D.stopEvent) {
            this.stopEvent = D.stopEvent
        }
        if (typeof N == "string") {
            var K = [];
            var I = N.toUpperCase();
            for (var E = 0, H = I.length; E < H; E++) {
                K.push(I.charCodeAt(E))
            }
            N = K
        }
        var B = Ext.isArray(N);
        var L = function(R) {
            if ((!C || R.shiftKey) && (!A || R.ctrlKey) && (!G || R.altKey)) {
                var P = R.getKey();
                if (B) {
                    for (var Q = 0, O = N.length; Q < O; Q++) {
                        if (N[Q] == P) {
                            if (this.stopEvent) {
                                R.stopEvent()
                            }
                            J.call(M || window, P, R);
                            return
                        }
                    }
                } else {
                    if (P == N) {
                        if (this.stopEvent) {
                            R.stopEvent()
                        }
                        J.call(M || window, P, R)
                    }
                }
            }
        };
        this.bindings.push(L)
    },
    on: function(B, D, C) {
        var G, A, E, F;
        if (typeof B == "object" && !Ext.isArray(B)) {
            G = B.key;
            A = B.shift;
            E = B.ctrl;
            F = B.alt
        } else {
            G = B
        }
        this.addBinding({
            key: G,
            shift: A,
            ctrl: E,
            alt: F,
            fn: D,
            scope: C
        })
    },
    handleKeyDown: function(D) {
        if (this.enabled) {
            var B = this.bindings;
            for (var C = 0, A = B.length; C < A; C++) {
                B[C].call(this, D)
            }
        }
    },
    isEnabled: function() {
        return this.enabled
    },
    enable: function() {
        if (!this.enabled) {
            this.el.on(this.eventName, this.handleKeyDown, this);
            this.enabled = true
        }
    },
    disable: function() {
        if (this.enabled) {
            this.el.removeListener(this.eventName, this.handleKeyDown, this);
            this.enabled = false
        }
    }
};
Ext.util.TextMetrics = function() {
    var A;
    return {
        measure: function(B, C, D) {
            if (!A) {
                A = Ext.util.TextMetrics.Instance(B, D)
            }
            A.bind(B);
            A.setFixedWidth(D || "auto");
            return A.getSize(C)
        },
        createInstance: function(B, C) {
            return Ext.util.TextMetrics.Instance(B, C)
        }
    }
} ();
Ext.util.TextMetrics.Instance = function(B, D) {
    var C = new Ext.Element(document.createElement("div"));
    document.body.appendChild(C.dom);
    C.position("absolute");
    C.setLeftTop( - 1000, -1000);
    C.hide();
    if (D) {
        C.setWidth(D)
    }
    var A = {
        getSize: function(F) {
            C.update(F);
            var E = C.getSize();
            C.update("");
            return E
        },
        bind: function(E) {
            C.setStyle(Ext.fly(E).getStyles("font-size", "font-style", "font-weight", "font-family", "line-height", "text-transform", "letter-spacing"))
        },
        setFixedWidth: function(E) {
            C.setWidth(E)
        },
        getWidth: function(E) {
            C.dom.style.width = "auto";
            return this.getSize(E).width
        },
        getHeight: function(E) {
            return this.getSize(E).height
        }
    };
    A.bind(B);
    return A
};
Ext.Element.measureText = Ext.util.TextMetrics.measure;
(function() {
    var A = Ext.EventManager;
    var B = Ext.lib.Dom;
    Ext.dd.DragDrop = function(E, C, D) {
        if (E) {
            this.init(E, C, D)
        }
    };
    Ext.dd.DragDrop.prototype = {
        id: null,
        config: null,
        dragElId: null,
        handleElId: null,
        invalidHandleTypes: null,
        invalidHandleIds: null,
        invalidHandleClasses: null,
        startPageX: 0,
        startPageY: 0,
        groups: null,
        locked: false,
        lock: function() {
            this.locked = true
        },
        unlock: function() {
            this.locked = false
        },
        isTarget: true,
        padding: null,
        _domRef: null,
        __ygDragDrop: true,
        constrainX: false,
        constrainY: false,
        minX: 0,
        maxX: 0,
        minY: 0,
        maxY: 0,
        maintainOffset: false,
        xTicks: null,
        yTicks: null,
        primaryButtonOnly: true,
        available: false,
        hasOuterHandles: false,
        b4StartDrag: function(C, D) {},
        startDrag: function(C, D) {},
        b4Drag: function(C) {},
        onDrag: function(C) {},
        onDragEnter: function(C, D) {},
        b4DragOver: function(C) {},
        onDragOver: function(C, D) {},
        b4DragOut: function(C) {},
        onDragOut: function(C, D) {},
        b4DragDrop: function(C) {},
        onDragDrop: function(C, D) {},
        onInvalidDrop: function(C) {},
        b4EndDrag: function(C) {},
        endDrag: function(C) {},
        b4MouseDown: function(C) {},
        onMouseDown: function(C) {},
        onMouseUp: function(C) {},
        onAvailable: function() {},
        defaultPadding: {
            left: 0,
            right: 0,
            top: 0,
            bottom: 0
        },
        constrainTo: function(H, F, M) {
            if (typeof F == "number") {
                F = {
                    left: F,
                    right: F,
                    top: F,
                    bottom: F
                }
            }
            F = F || this.defaultPadding;
            var J = Ext.get(this.getEl()).getBox();
            var C = Ext.get(H);
            var L = C.getScroll();
            var I, D = C.dom;
            if (D == document.body) {
                I = {
                    x: L.left,
                    y: L.top,
                    width: Ext.lib.Dom.getViewWidth(),
                    height: Ext.lib.Dom.getViewHeight()
                }
            } else {
                var K = C.getXY();
                I = {
                    x: K[0] + L.left,
                    y: K[1] + L.top,
                    width: D.clientWidth,
                    height: D.clientHeight
                }
            }
            var G = J.y - I.y;
            var E = J.x - I.x;
            this.resetConstraints();
            this.setXConstraint(E - (F.left || 0), I.width - E - J.width - (F.right || 0), this.xTickSize);
            this.setYConstraint(G - (F.top || 0), I.height - G - J.height - (F.bottom || 0), this.yTickSize)
        },
        getEl: function() {
            if (!this._domRef) {
                this._domRef = Ext.getDom(this.id)
            }
            return this._domRef
        },
        getDragEl: function() {
            return Ext.getDom(this.dragElId)
        },
        init: function(E, C, D) {
            this.initTarget(E, C, D);
            A.on(this.id, "mousedown", this.handleMouseDown, this)
        },
        initTarget: function(E, C, D) {
            this.config = D || {};
            this.DDM = Ext.dd.DDM;
            this.groups = {};
            if (typeof E !== "string") {
                E = Ext.id(E)
            }
            this.id = E;
            this.addToGroup((C) ? C: "default");
            this.handleElId = E;
            this.setDragElId(E);
            this.invalidHandleTypes = {
                A: "A"
            };
            this.invalidHandleIds = {};
            this.invalidHandleClasses = [];
            this.applyConfig();
            this.handleOnAvailable()
        },
        applyConfig: function() {
            this.padding = this.config.padding || [0, 0, 0, 0];
            this.isTarget = (this.config.isTarget !== false);
            this.maintainOffset = (this.config.maintainOffset);
            this.primaryButtonOnly = (this.config.primaryButtonOnly !== false)
        },
        handleOnAvailable: function() {
            this.available = true;
            this.resetConstraints();
            this.onAvailable()
        },
        setPadding: function(E, C, F, D) {
            if (!C && 0 !== C) {
                this.padding = [E, E, E, E]
            } else {
                if (!F && 0 !== F) {
                    this.padding = [E, C, E, C]
                } else {
                    this.padding = [E, C, F, D]
                }
            }
        },
        setInitPosition: function(F, E) {
            var G = this.getEl();
            if (!this.DDM.verifyEl(G)) {
                return
            }
            var D = F || 0;
            var C = E || 0;
            var H = B.getXY(G);
            this.initPageX = H[0] - D;
            this.initPageY = H[1] - C;
            this.lastPageX = H[0];
            this.lastPageY = H[1];
            this.setStartPosition(H)
        },
        setStartPosition: function(D) {
            var C = D || B.getXY(this.getEl());
            this.deltaSetXY = null;
            this.startPageX = C[0];
            this.startPageY = C[1]
        },
        addToGroup: function(C) {
            this.groups[C] = true;
            this.DDM.regDragDrop(this, C)
        },
        removeFromGroup: function(C) {
            if (this.groups[C]) {
                delete this.groups[C]
            }
            this.DDM.removeDDFromGroup(this, C)
        },
        setDragElId: function(C) {
            this.dragElId = C
        },
        setHandleElId: function(C) {
            if (typeof C !== "string") {
                C = Ext.id(C)
            }
            this.handleElId = C;
            this.DDM.regHandle(this.id, C)
        },
        setOuterHandleElId: function(C) {
            if (typeof C !== "string") {
                C = Ext.id(C)
            }
            A.on(C, "mousedown", this.handleMouseDown, this);
            this.setHandleElId(C);
            this.hasOuterHandles = true
        },
        unreg: function() {
            A.un(this.id, "mousedown", this.handleMouseDown);
            this._domRef = null;
            this.DDM._remove(this)
        },
        destroy: function() {
            this.unreg()
        },
        isLocked: function() {
            return (this.DDM.isLocked() || this.locked)
        },
        handleMouseDown: function(E, D) {
            if (this.primaryButtonOnly && E.button != 0) {
                return
            }
            if (this.isLocked()) {
                return
            }
            this.DDM.refreshCache(this.groups);
            var C = new Ext.lib.Point(Ext.lib.Event.getPageX(E), Ext.lib.Event.getPageY(E));
            if (!this.hasOuterHandles && !this.DDM.isOverTarget(C, this)) {} else {
                if (this.clickValidator(E)) {
                    this.setStartPosition();
                    this.b4MouseDown(E);
                    this.onMouseDown(E);
                    this.DDM.handleMouseDown(E, this);
                    this.DDM.stopEvent(E)
                } else {}
            }
        },
        clickValidator: function(D) {
            var C = D.getTarget();
            return (this.isValidHandleChild(C) && (this.id == this.handleElId || this.DDM.handleWasClicked(C, this.id)))
        },
        addInvalidHandleType: function(C) {
            var D = C.toUpperCase();
            this.invalidHandleTypes[D] = D
        },
        addInvalidHandleId: function(C) {
            if (typeof C !== "string") {
                C = Ext.id(C)
            }
            this.invalidHandleIds[C] = C
        },
        addInvalidHandleClass: function(C) {
            this.invalidHandleClasses.push(C)
        },
        removeInvalidHandleType: function(C) {
            var D = C.toUpperCase();
            delete this.invalidHandleTypes[D]
        },
        removeInvalidHandleId: function(C) {
            if (typeof C !== "string") {
                C = Ext.id(C)
            }
            delete this.invalidHandleIds[C]
        },
        removeInvalidHandleClass: function(D) {
            for (var E = 0, C = this.invalidHandleClasses.length; E < C; ++E) {
                if (this.invalidHandleClasses[E] == D) {
                    delete this.invalidHandleClasses[E]
                }
            }
        },
        isValidHandleChild: function(F) {
            var E = true;
            var H;
            try {
                H = F.nodeName.toUpperCase()
            } catch(G) {
                H = F.nodeName
            }
            E = E && !this.invalidHandleTypes[H];
            E = E && !this.invalidHandleIds[F.id];
            for (var D = 0, C = this.invalidHandleClasses.length; E && D < C; ++D) {
                E = !Ext.fly(F).hasClass(this.invalidHandleClasses[D])
            }
            return E
        },
        setXTicks: function(F, C) {
            this.xTicks = [];
            this.xTickSize = C;
            var E = {};
            for (var D = this.initPageX; D >= this.minX; D = D - C) {
                if (!E[D]) {
                    this.xTicks[this.xTicks.length] = D;
                    E[D] = true
                }
            }
            for (D = this.initPageX; D <= this.maxX; D = D + C) {
                if (!E[D]) {
                    this.xTicks[this.xTicks.length] = D;
                    E[D] = true
                }
            }
            this.xTicks.sort(this.DDM.numericSort)
        },
        setYTicks: function(F, C) {
            this.yTicks = [];
            this.yTickSize = C;
            var E = {};
            for (var D = this.initPageY; D >= this.minY; D = D - C) {
                if (!E[D]) {
                    this.yTicks[this.yTicks.length] = D;
                    E[D] = true
                }
            }
            for (D = this.initPageY; D <= this.maxY; D = D + C) {
                if (!E[D]) {
                    this.yTicks[this.yTicks.length] = D;
                    E[D] = true
                }
            }
            this.yTicks.sort(this.DDM.numericSort)
        },
        setXConstraint: function(E, D, C) {
            this.leftConstraint = E;
            this.rightConstraint = D;
            this.minX = this.initPageX - E;
            this.maxX = this.initPageX + D;
            if (C) {
                this.setXTicks(this.initPageX, C)
            }
            this.constrainX = true
        },
        clearConstraints: function() {
            this.constrainX = false;
            this.constrainY = false;
            this.clearTicks()
        },
        clearTicks: function() {
            this.xTicks = null;
            this.yTicks = null;
            this.xTickSize = 0;
            this.yTickSize = 0
        },
        setYConstraint: function(C, E, D) {
            this.topConstraint = C;
            this.bottomConstraint = E;
            this.minY = this.initPageY - C;
            this.maxY = this.initPageY + E;
            if (D) {
                this.setYTicks(this.initPageY, D)
            }
            this.constrainY = true
        },
        resetConstraints: function() {
            if (this.initPageX || this.initPageX === 0) {
                var D = (this.maintainOffset) ? this.lastPageX - this.initPageX: 0;
                var C = (this.maintainOffset) ? this.lastPageY - this.initPageY: 0;
                this.setInitPosition(D, C)
            } else {
                this.setInitPosition()
            }
            if (this.constrainX) {
                this.setXConstraint(this.leftConstraint, this.rightConstraint, this.xTickSize)
            }
            if (this.constrainY) {
                this.setYConstraint(this.topConstraint, this.bottomConstraint, this.yTickSize)
            }
        },
        getTick: function(I, F) {
            if (!F) {
                return I
            } else {
                if (F[0] >= I) {
                    return F[0]
                } else {
                    for (var D = 0, C = F.length; D < C; ++D) {
                        var E = D + 1;
                        if (F[E] && F[E] >= I) {
                            var H = I - F[D];
                            var G = F[E] - I;
                            return (G > H) ? F[D] : F[E]
                        }
                    }
                    return F[F.length - 1]
                }
            }
        },
        toString: function() {
            return ("DragDrop " + this.id)
        }
    }
})();
if (!Ext.dd.DragDropMgr) {
    Ext.dd.DragDropMgr = function() {
        var A = Ext.EventManager;
        return {
            ids: {},
            handleIds: {},
            dragCurrent: null,
            dragOvers: {},
            deltaX: 0,
            deltaY: 0,
            preventDefault: true,
            stopPropagation: true,
            initialized: false,
            locked: false,
            init: function() {
                this.initialized = true
            },
            POINT: 0,
            INTERSECT: 1,
            mode: 0,
            _execOnAll: function(D, C) {
                for (var E in this.ids) {
                    for (var B in this.ids[E]) {
                        var F = this.ids[E][B];
                        if (!this.isTypeOfDD(F)) {
                            continue
                        }
                        F[D].apply(F, C)
                    }
                }
            },
            _onLoad: function() {
                this.init();
                A.on(document, "mouseup", this.handleMouseUp, this, true);
                A.on(document, "mousemove", this.handleMouseMove, this, true);
                A.on(window, "unload", this._onUnload, this, true);
                A.on(window, "resize", this._onResize, this, true)
            },
            _onResize: function(B) {
                this._execOnAll("resetConstraints", [])
            },
            lock: function() {
                this.locked = true
            },
            unlock: function() {
                this.locked = false
            },
            isLocked: function() {
                return this.locked
            },
            locationCache: {},
            useCache: true,
            clickPixelThresh: 3,
            clickTimeThresh: 350,
            dragThreshMet: false,
            clickTimeout: null,
            startX: 0,
            startY: 0,
            regDragDrop: function(C, B) {
                if (!this.initialized) {
                    this.init()
                }
                if (!this.ids[B]) {
                    this.ids[B] = {}
                }
                this.ids[B][C.id] = C
            },
            removeDDFromGroup: function(D, B) {
                if (!this.ids[B]) {
                    this.ids[B] = {}
                }
                var C = this.ids[B];
                if (C && C[D.id]) {
                    delete C[D.id]
                }
            },
            _remove: function(C) {
                for (var B in C.groups) {
                    if (B && this.ids[B][C.id]) {
                        delete this.ids[B][C.id]
                    }
                }
                delete this.handleIds[C.id]
            },
            regHandle: function(C, B) {
                if (!this.handleIds[C]) {
                    this.handleIds[C] = {}
                }
                this.handleIds[C][B] = B
            },
            isDragDrop: function(B) {
                return (this.getDDById(B)) ? true: false
            },
            getRelated: function(F, C) {
                var E = [];
                for (var D in F.groups) {
                    for (j in this.ids[D]) {
                        var B = this.ids[D][j];
                        if (!this.isTypeOfDD(B)) {
                            continue
                        }
                        if (!C || B.isTarget) {
                            E[E.length] = B
                        }
                    }
                }
                return E
            },
            isLegalTarget: function(F, E) {
                var C = this.getRelated(F, true);
                for (var D = 0, B = C.length; D < B; ++D) {
                    if (C[D].id == E.id) {
                        return true
                    }
                }
                return false
            },
            isTypeOfDD: function(B) {
                return (B && B.__ygDragDrop)
            },
            isHandle: function(C, B) {
                return (this.handleIds[C] && this.handleIds[C][B])
            },
            getDDById: function(C) {
                for (var B in this.ids) {
                    if (this.ids[B][C]) {
                        return this.ids[B][C]
                    }
                }
                return null
            },
            handleMouseDown: function(D, C) {
                if (Ext.QuickTips) {
                    Ext.QuickTips.disable()
                }
                this.currentTarget = D.getTarget();
                this.dragCurrent = C;
                var B = C.getEl();
                this.startX = D.getPageX();
                this.startY = D.getPageY();
                this.deltaX = this.startX - B.offsetLeft;
                this.deltaY = this.startY - B.offsetTop;
                this.dragThreshMet = false;
                this.clickTimeout = setTimeout(function() {
                    var E = Ext.dd.DDM;
                    E.startDrag(E.startX, E.startY)
                },
                this.clickTimeThresh)
            },
            startDrag: function(B, C) {
                clearTimeout(this.clickTimeout);
                if (this.dragCurrent) {
                    this.dragCurrent.b4StartDrag(B, C);
                    this.dragCurrent.startDrag(B, C)
                }
                this.dragThreshMet = true
            },
            handleMouseUp: function(B) {
                if (Ext.QuickTips) {
                    Ext.QuickTips.enable()
                }
                if (!this.dragCurrent) {
                    return
                }
                clearTimeout(this.clickTimeout);
                if (this.dragThreshMet) {
                    this.fireEvents(B, true)
                } else {}
                this.stopDrag(B);
                this.stopEvent(B)
            },
            stopEvent: function(B) {
                if (this.stopPropagation) {
                    B.stopPropagation()
                }
                if (this.preventDefault) {
                    B.preventDefault()
                }
            },
            stopDrag: function(B) {
                if (this.dragCurrent) {
                    if (this.dragThreshMet) {
                        this.dragCurrent.b4EndDrag(B);
                        this.dragCurrent.endDrag(B)
                    }
                    this.dragCurrent.onMouseUp(B)
                }
                this.dragCurrent = null;
                this.dragOvers = {}
            },
            handleMouseMove: function(D) {
                if (!this.dragCurrent) {
                    return true
                }
                if (Ext.isIE && (D.button !== 0 && D.button !== 1 && D.button !== 2)) {
                    this.stopEvent(D);
                    return this.handleMouseUp(D)
                }
                if (!this.dragThreshMet) {
                    var C = Math.abs(this.startX - D.getPageX());
                    var B = Math.abs(this.startY - D.getPageY());
                    if (C > this.clickPixelThresh || B > this.clickPixelThresh) {
                        this.startDrag(this.startX, this.startY)
                    }
                }
                if (this.dragThreshMet) {
                    this.dragCurrent.b4Drag(D);
                    this.dragCurrent.onDrag(D);
                    if (!this.dragCurrent.moveOnly) {
                        this.fireEvents(D, false)
                    }
                }
                this.stopEvent(D);
                return true
            },
            fireEvents: function(K, L) {
                var N = this.dragCurrent;
                if (!N || N.isLocked()) {
                    return
                }
                var O = K.getPoint();
                var B = [];
                var E = [];
                var I = [];
                var G = [];
                var D = [];
                for (var F in this.dragOvers) {
                    var C = this.dragOvers[F];
                    if (!this.isTypeOfDD(C)) {
                        continue
                    }
                    if (!this.isOverTarget(O, C, this.mode)) {
                        E.push(C)
                    }
                    B[F] = true;
                    delete this.dragOvers[F]
                }
                for (var M in N.groups) {
                    if ("string" != typeof M) {
                        continue
                    }
                    for (F in this.ids[M]) {
                        var H = this.ids[M][F];
                        if (!this.isTypeOfDD(H)) {
                            continue
                        }
                        if (H.isTarget && !H.isLocked() && H != N) {
                            if (this.isOverTarget(O, H, this.mode)) {
                                if (L) {
                                    G.push(H)
                                } else {
                                    if (!B[H.id]) {
                                        D.push(H)
                                    } else {
                                        I.push(H)
                                    }
                                    this.dragOvers[H.id] = H
                                }
                            }
                        }
                    }
                }
                if (this.mode) {
                    if (E.length) {
                        N.b4DragOut(K, E);
                        N.onDragOut(K, E)
                    }
                    if (D.length) {
                        N.onDragEnter(K, D)
                    }
                    if (I.length) {
                        N.b4DragOver(K, I);
                        N.onDragOver(K, I)
                    }
                    if (G.length) {
                        N.b4DragDrop(K, G);
                        N.onDragDrop(K, G)
                    }
                } else {
                    var J = 0;
                    for (F = 0, J = E.length; F < J; ++F) {
                        N.b4DragOut(K, E[F].id);
                        N.onDragOut(K, E[F].id)
                    }
                    for (F = 0, J = D.length; F < J; ++F) {
                        N.onDragEnter(K, D[F].id)
                    }
                    for (F = 0, J = I.length; F < J; ++F) {
                        N.b4DragOver(K, I[F].id);
                        N.onDragOver(K, I[F].id)
                    }
                    for (F = 0, J = G.length; F < J; ++F) {
                        N.b4DragDrop(K, G[F].id);
                        N.onDragDrop(K, G[F].id)
                    }
                }
                if (L && !G.length) {
                    N.onInvalidDrop(K)
                }
            },
            getBestMatch: function(D) {
                var F = null;
                var C = D.length;
                if (C == 1) {
                    F = D[0]
                } else {
                    for (var E = 0; E < C; ++E) {
                        var B = D[E];
                        if (B.cursorIsOver) {
                            F = B;
                            break
                        } else {
                            if (!F || F.overlap.getArea() < B.overlap.getArea()) {
                                F = B
                            }
                        }
                    }
                }
                return F
            },
            refreshCache: function(C) {
                for (var B in C) {
                    if ("string" != typeof B) {
                        continue
                    }
                    for (var D in this.ids[B]) {
                        var E = this.ids[B][D];
                        if (this.isTypeOfDD(E)) {
                            var F = this.getLocation(E);
                            if (F) {
                                this.locationCache[E.id] = F
                            } else {
                                delete this.locationCache[E.id]
                            }
                        }
                    }
                }
            },
            verifyEl: function(C) {
                if (C) {
                    var B;
                    if (Ext.isIE) {
                        try {
                            B = C.offsetParent
                        } catch(D) {}
                    } else {
                        B = C.offsetParent
                    }
                    if (B) {
                        return true
                    }
                }
                return false
            },
            getLocation: function(G) {
                if (!this.isTypeOfDD(G)) {
                    return null
                }
                var E = G.getEl(),
                J,
                D,
                C,
                L,
                K,
                M,
                B,
                I,
                F;
                try {
                    J = Ext.lib.Dom.getXY(E)
                } catch(H) {}
                if (!J) {
                    return null
                }
                D = J[0];
                C = D + E.offsetWidth;
                L = J[1];
                K = L + E.offsetHeight;
                M = L - G.padding[0];
                B = C + G.padding[1];
                I = K + G.padding[2];
                F = D - G.padding[3];
                return new Ext.lib.Region(M, B, I, F)
            },
            isOverTarget: function(J, B, D) {
                var F = this.locationCache[B.id];
                if (!F || !this.useCache) {
                    F = this.getLocation(B);
                    this.locationCache[B.id] = F
                }
                if (!F) {
                    return false
                }
                B.cursorIsOver = F.contains(J);
                var I = this.dragCurrent;
                if (!I || !I.getTargetCoord || (!D && !I.constrainX && !I.constrainY)) {
                    return B.cursorIsOver
                }
                B.overlap = null;
                var G = I.getTargetCoord(J.x, J.y);
                var C = I.getDragEl();
                var E = new Ext.lib.Region(G.y, G.x + C.offsetWidth, G.y + C.offsetHeight, G.x);
                var H = E.intersect(F);
                if (H) {
                    B.overlap = H;
                    return (D) ? true: B.cursorIsOver
                } else {
                    return false
                }
            },
            _onUnload: function(C, B) {
                Ext.dd.DragDropMgr.unregAll()
            },
            unregAll: function() {
                if (this.dragCurrent) {
                    this.stopDrag();
                    this.dragCurrent = null
                }
                this._execOnAll("unreg", []);
                for (var B in this.elementCache) {
                    delete this.elementCache[B]
                }
                this.elementCache = {};
                this.ids = {}
            },
            elementCache: {},
            getElWrapper: function(C) {
                var B = this.elementCache[C];
                if (!B || !B.el) {
                    B = this.elementCache[C] = new this.ElementWrapper(Ext.getDom(C))
                }
                return B
            },
            getElement: function(B) {
                return Ext.getDom(B)
            },
            getCss: function(C) {
                var B = Ext.getDom(C);
                return (B) ? B.style: null
            },
            ElementWrapper: function(B) {
                this.el = B || null;
                this.id = this.el && B.id;
                this.css = this.el && B.style
            },
            getPosX: function(B) {
                return Ext.lib.Dom.getX(B)
            },
            getPosY: function(B) {
                return Ext.lib.Dom.getY(B)
            },
            swapNode: function(D, B) {
                if (D.swapNode) {
                    D.swapNode(B)
                } else {
                    var E = B.parentNode;
                    var C = B.nextSibling;
                    if (C == D) {
                        E.insertBefore(D, B)
                    } else {
                        if (B == D.nextSibling) {
                            E.insertBefore(B, D)
                        } else {
                            D.parentNode.replaceChild(B, D);
                            E.insertBefore(D, C)
                        }
                    }
                }
            },
            getScroll: function() {
                var D, B, E = document.documentElement,
                C = document.body;
                if (E && (E.scrollTop || E.scrollLeft)) {
                    D = E.scrollTop;
                    B = E.scrollLeft
                } else {
                    if (C) {
                        D = C.scrollTop;
                        B = C.scrollLeft
                    } else {}
                }
                return {
                    top: D,
                    left: B
                }
            },
            getStyle: function(C, B) {
                return Ext.fly(C).getStyle(B)
            },
            getScrollTop: function() {
                return this.getScroll().top
            },
            getScrollLeft: function() {
                return this.getScroll().left
            },
            moveToEl: function(B, D) {
                var C = Ext.lib.Dom.getXY(D);
                Ext.lib.Dom.setXY(B, C)
            },
            numericSort: function(C, B) {
                return (C - B)
            },
            _timeoutCount: 0,
            _addListeners: function() {
                var B = Ext.dd.DDM;
                if (Ext.lib.Event && document) {
                    B._onLoad()
                } else {
                    if (B._timeoutCount > 2000) {} else {
                        setTimeout(B._addListeners, 10);
                        if (document && document.body) {
                            B._timeoutCount += 1
                        }
                    }
                }
            },
            handleWasClicked: function(B, D) {
                if (this.isHandle(D, B.id)) {
                    return true
                } else {
                    var C = B.parentNode;
                    while (C) {
                        if (this.isHandle(D, C.id)) {
                            return true
                        } else {
                            C = C.parentNode
                        }
                    }
                }
                return false
            }
        }
    } ();
    Ext.dd.DDM = Ext.dd.DragDropMgr;
    Ext.dd.DDM._addListeners()
}
Ext.dd.DD = function(C, A, B) {
    if (C) {
        this.init(C, A, B)
    }
};
Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
    scroll: true,
    autoOffset: function(C, B) {
        var A = C - this.startPageX;
        var D = B - this.startPageY;
        this.setDelta(A, D)
    },
    setDelta: function(B, A) {
        this.deltaX = B;
        this.deltaY = A
    },
    setDragElPos: function(C, B) {
        var A = this.getDragEl();
        this.alignElWithMouse(A, C, B)
    },
    alignElWithMouse: function(C, G, F) {
        var E = this.getTargetCoord(G, F);
        var B = C.dom ? C: Ext.fly(C, "_dd");
        if (!this.deltaSetXY) {
            var H = [E.x, E.y];
            B.setXY(H);
            var D = B.getLeft(true);
            var A = B.getTop(true);
            this.deltaSetXY = [D - E.x, A - E.y]
        } else {
            B.setLeftTop(E.x + this.deltaSetXY[0], E.y + this.deltaSetXY[1])
        }
        this.cachePosition(E.x, E.y);
        this.autoScroll(E.x, E.y, C.offsetHeight, C.offsetWidth);
        return E
    },
    cachePosition: function(B, A) {
        if (B) {
            this.lastPageX = B;
            this.lastPageY = A
        } else {
            var C = Ext.lib.Dom.getXY(this.getEl());
            this.lastPageX = C[0];
            this.lastPageY = C[1]
        }
    },
    autoScroll: function(J, I, E, K) {
        if (this.scroll) {
            var L = Ext.lib.Dom.getViewHeight();
            var B = Ext.lib.Dom.getViewWidth();
            var N = this.DDM.getScrollTop();
            var D = this.DDM.getScrollLeft();
            var H = E + I;
            var M = K + J;
            var G = (L + N - I - this.deltaY);
            var F = (B + D - J - this.deltaX);
            var C = 40;
            var A = (document.all) ? 80 : 30;
            if (H > L && G < C) {
                window.scrollTo(D, N + A)
            }
            if (I < N && N > 0 && I - N < C) {
                window.scrollTo(D, N - A)
            }
            if (M > B && F < C) {
                window.scrollTo(D + A, N)
            }
            if (J < D && D > 0 && J - D < C) {
                window.scrollTo(D - A, N)
            }
        }
    },
    getTargetCoord: function(C, B) {
        var A = C - this.deltaX;
        var D = B - this.deltaY;
        if (this.constrainX) {
            if (A < this.minX) {
                A = this.minX
            }
            if (A > this.maxX) {
                A = this.maxX
            }
        }
        if (this.constrainY) {
            if (D < this.minY) {
                D = this.minY
            }
            if (D > this.maxY) {
                D = this.maxY
            }
        }
        A = this.getTick(A, this.xTicks);
        D = this.getTick(D, this.yTicks);
        return {
            x: A,
            y: D
        }
    },
    applyConfig: function() {
        Ext.dd.DD.superclass.applyConfig.call(this);
        this.scroll = (this.config.scroll !== false)
    },
    b4MouseDown: function(A) {
        this.autoOffset(A.getPageX(), A.getPageY())
    },
    b4Drag: function(A) {
        this.setDragElPos(A.getPageX(), A.getPageY())
    },
    toString: function() {
        return ("DD " + this.id)
    }
});
Ext.dd.DDProxy = function(C, A, B) {
    if (C) {
        this.init(C, A, B);
        this.initFrame()
    }
};
Ext.dd.DDProxy.dragElId = "ygddfdiv";
Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
    resizeFrame: true,
    centerFrame: false,
    createFrame: function() {
        var B = this;
        var A = document.body;
        if (!A || !A.firstChild) {
            setTimeout(function() {
                B.createFrame()
            },
            50);
            return
        }
        var D = this.getDragEl();
        if (!D) {
            D = document.createElement("div");
            D.id = this.dragElId;
            var C = D.style;
            C.position = "absolute";
            C.visibility = "hidden";
            C.cursor = "move";
            C.border = "2px solid #aaa";
            C.zIndex = 999;
            A.insertBefore(D, A.firstChild)
        }
    },
    initFrame: function() {
        this.createFrame()
    },
    applyConfig: function() {
        Ext.dd.DDProxy.superclass.applyConfig.call(this);
        this.resizeFrame = (this.config.resizeFrame !== false);
        this.centerFrame = (this.config.centerFrame);
        this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId)
    },
    showFrame: function(E, D) {
        var C = this.getEl();
        var A = this.getDragEl();
        var B = A.style;
        this._resizeProxy();
        if (this.centerFrame) {
            this.setDelta(Math.round(parseInt(B.width, 10) / 2), Math.round(parseInt(B.height, 10) / 2))
        }
        this.setDragElPos(E, D);
        Ext.fly(A).show()
    },
    _resizeProxy: function() {
        if (this.resizeFrame) {
            var A = this.getEl();
            Ext.fly(this.getDragEl()).setSize(A.offsetWidth, A.offsetHeight)
        }
    },
    b4MouseDown: function(B) {
        var A = B.getPageX();
        var C = B.getPageY();
        this.autoOffset(A, C);
        this.setDragElPos(A, C)
    },
    b4StartDrag: function(A, B) {
        this.showFrame(A, B)
    },
    b4EndDrag: function(A) {
        Ext.fly(this.getDragEl()).hide()
    },
    endDrag: function(C) {
        var B = this.getEl();
        var A = this.getDragEl();
        A.style.visibility = "";
        this.beforeMove();
        B.style.visibility = "hidden";
        Ext.dd.DDM.moveToEl(B, A);
        A.style.visibility = "hidden";
        B.style.visibility = "";
        this.afterDrag()
    },
    beforeMove: function() {},
    afterDrag: function() {},
    toString: function() {
        return ("DDProxy " + this.id)
    }
});
Ext.dd.DDTarget = function(C, A, B) {
    if (C) {
        this.initTarget(C, A, B)
    }
};
Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
    toString: function() {
        return ("DDTarget " + this.id)
    }
});
Ext.dd.DragTracker = function(A) {
    Ext.apply(this, A);
    this.addEvents("mousedown", "mouseup", "mousemove", "dragstart", "dragend", "drag");
    this.dragRegion = new Ext.lib.Region(0, 0, 0, 0);
    if (this.el) {
        this.initEl(this.el)
    }
};
Ext.extend(Ext.dd.DragTracker, Ext.util.Observable, {
    active: false,
    tolerance: 5,
    autoStart: false,
    initEl: function(A) {
        this.el = Ext.get(A);
        A.on("mousedown", this.onMouseDown, this, this.delegate ? {
            delegate: this.delegate
        }: undefined)
    },
    destroy: function() {
        this.el.un("mousedown", this.onMouseDown, this)
    },
    onMouseDown: function(C, B) {
        if (this.fireEvent("mousedown", this, C) !== false && this.onBeforeStart(C) !== false) {
            this.startXY = this.lastXY = C.getXY();
            this.dragTarget = this.delegate ? B: this.el.dom;
            C.preventDefault();
            var A = Ext.getDoc();
            A.on("mouseup", this.onMouseUp, this);
            A.on("mousemove", this.onMouseMove, this);
            A.on("selectstart", this.stopSelect, this);
            if (this.autoStart) {
                this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this)
            }
        }
    },
    onMouseMove: function(D, C) {
        D.preventDefault();
        var B = D.getXY(),
        A = this.startXY;
        this.lastXY = B;
        if (!this.active) {
            if (Math.abs(A[0] - B[0]) > this.tolerance || Math.abs(A[1] - B[1]) > this.tolerance) {
                this.triggerStart()
            } else {
                return
            }
        }
        this.fireEvent("mousemove", this, D);
        this.onDrag(D);
        this.fireEvent("drag", this, D)
    },
    onMouseUp: function(B) {
        var A = Ext.getDoc();
        A.un("mousemove", this.onMouseMove, this);
        A.un("mouseup", this.onMouseUp, this);
        A.un("selectstart", this.stopSelect, this);
        B.preventDefault();
        this.clearStart();
        this.active = false;
        delete this.elRegion;
        this.fireEvent("mouseup", this, B);
        this.onEnd(B);
        this.fireEvent("dragend", this, B)
    },
    triggerStart: function(A) {
        this.clearStart();
        this.active = true;
        this.onStart(this.startXY);
        this.fireEvent("dragstart", this, this.startXY)
    },
    clearStart: function() {
        if (this.timer) {
            clearTimeout(this.timer);
            delete this.timer
        }
    },
    stopSelect: function(A) {
        A.stopEvent();
        return false
    },
    onBeforeStart: function(A) {},
    onStart: function(A) {},
    onDrag: function(A) {},
    onEnd: function(A) {},
    getDragTarget: function() {
        return this.dragTarget
    },
    getDragCt: function() {
        return this.el
    },
    getXY: function(A) {
        return A ? this.constrainModes[A].call(this, this.lastXY) : this.lastXY
    },
    getOffset: function(C) {
        var B = this.getXY(C);
        var A = this.startXY;
        return [A[0] - B[0], A[1] - B[1]]
    },
    constrainModes: {
        "point": function(B) {
            if (!this.elRegion) {
                this.elRegion = this.getDragCt().getRegion()
            }
            var A = this.dragRegion;
            A.left = B[0];
            A.top = B[1];
            A.right = B[0];
            A.bottom = B[1];
            A.constrainTo(this.elRegion);
            return [A.left, A.top]
        }
    }
});
Ext.dd.ScrollManager = function() {
    var C = Ext.dd.DragDropMgr;
    var E = {};
    var B = null;
    var H = {};
    var G = function(K) {
        B = null;
        A()
    };
    var I = function() {
        if (C.dragCurrent) {
            C.refreshCache(C.dragCurrent.groups)
        }
    };
    var D = function() {
        if (C.dragCurrent) {
            var K = Ext.dd.ScrollManager;
            var L = H.el.ddScrollConfig ? H.el.ddScrollConfig.increment: K.increment;
            if (!K.animate) {
                if (H.el.scroll(H.dir, L)) {
                    I()
                }
            } else {
                H.el.scroll(H.dir, L, true, K.animDuration, I)
            }
        }
    };
    var A = function() {
        if (H.id) {
            clearInterval(H.id)
        }
        H.id = 0;
        H.el = null;
        H.dir = ""
    };
    var F = function(L, K) {
        A();
        H.el = L;
        H.dir = K;
        var M = (L.ddScrollConfig && L.ddScrollConfig.frequency) ? L.ddScrollConfig.frequency: Ext.dd.ScrollManager.frequency;
        H.id = setInterval(D, M)
    };
    var J = function(N, P) {
        if (P || !C.dragCurrent) {
            return
        }
        var Q = Ext.dd.ScrollManager;
        if (!B || B != C.dragCurrent) {
            B = C.dragCurrent;
            Q.refreshCache()
        }
        var R = Ext.lib.Event.getXY(N);
        var S = new Ext.lib.Point(R[0], R[1]);
        for (var L in E) {
            var M = E[L],
            K = M._region;
            var O = M.ddScrollConfig ? M.ddScrollConfig: Q;
            if (K && K.contains(S) && M.isScrollable()) {
                if (K.bottom - S.y <= O.vthresh) {
                    if (H.el != M) {
                        F(M, "down")
                    }
                    return
                } else {
                    if (K.right - S.x <= O.hthresh) {
                        if (H.el != M) {
                            F(M, "left")
                        }
                        return
                    } else {
                        if (S.y - K.top <= O.vthresh) {
                            if (H.el != M) {
                                F(M, "up")
                            }
                            return
                        } else {
                            if (S.x - K.left <= O.hthresh) {
                                if (H.el != M) {
                                    F(M, "right")
                                }
                                return
                            }
                        }
                    }
                }
            }
        }
        A()
    };
    C.fireEvents = C.fireEvents.createSequence(J, C);
    C.stopDrag = C.stopDrag.createSequence(G, C);
    return {
        register: function(M) {
            if (Ext.isArray(M)) {
                for (var L = 0, K = M.length; L < K; L++) {
                    this.register(M[L])
                }
            } else {
                M = Ext.get(M);
                E[M.id] = M
            }
        },
        unregister: function(M) {
            if (Ext.isArray(M)) {
                for (var L = 0, K = M.length; L < K; L++) {
                    this.unregister(M[L])
                }
            } else {
                M = Ext.get(M);
                delete E[M.id]
            }
        },
        vthresh: 25,
        hthresh: 25,
        increment: 100,
        frequency: 500,
        animate: true,
        animDuration: 0.4,
        refreshCache: function() {
            for (var K in E) {
                if (typeof E[K] == "object") {
                    E[K]._region = E[K].getRegion()
                }
            }
        }
    }
} ();
Ext.dd.Registry = function() {
    var D = {};
    var B = {};
    var A = 0;
    var C = function(F, E) {
        if (typeof F == "string") {
            return F
        }
        var G = F.id;
        if (!G && E !== false) {
            G = "extdd-" + (++A);
            F.id = G
        }
        return G
    };
    return {
        register: function(H, I) {
            I = I || {};
            if (typeof H == "string") {
                H = document.getElementById(H)
            }
            I.ddel = H;
            D[C(H)] = I;
            if (I.isHandle !== false) {
                B[I.ddel.id] = I
            }
            if (I.handles) {
                var G = I.handles;
                for (var F = 0, E = G.length; F < E; F++) {
                    B[C(G[F])] = I
                }
            }
        },
        unregister: function(H) {
            var J = C(H, false);
            var I = D[J];
            if (I) {
                delete D[J];
                if (I.handles) {
                    var G = I.handles;
                    for (var F = 0, E = G.length; F < E; F++) {
                        delete B[C(G[F], false)]
                    }
                }
            }
        },
        getHandle: function(E) {
            if (typeof E != "string") {
                E = E.id
            }
            return B[E]
        },
        getHandleFromEvent: function(F) {
            var E = Ext.lib.Event.getTarget(F);
            return E ? B[E.id] : null
        },
        getTarget: function(E) {
            if (typeof E != "string") {
                E = E.id
            }
            return D[E]
        },
        getTargetFromEvent: function(F) {
            var E = Ext.lib.Event.getTarget(F);
            return E ? D[E.id] || B[E.id] : null
        }
    }
} ();
Ext.dd.StatusProxy = function(A) {
    Ext.apply(this, A);
    this.id = this.id || Ext.id();
    this.el = new Ext.Layer({
        dh: {
            id: this.id,
            tag: "div",
            cls: "x-dd-drag-proxy " + this.dropNotAllowed,
            children: [{
                tag: "div",
                cls: "x-dd-drop-icon"
            },
            {
                tag: "div",
                cls: "x-dd-drag-ghost"
            }]
        },
        shadow: !A || A.shadow !== false
    });
    this.ghost = Ext.get(this.el.dom.childNodes[1]);
    this.dropStatus = this.dropNotAllowed
};
Ext.dd.StatusProxy.prototype = {
    dropAllowed: "x-dd-drop-ok",
    dropNotAllowed: "x-dd-drop-nodrop",
    setStatus: function(A) {
        A = A || this.dropNotAllowed;
        if (this.dropStatus != A) {
            this.el.replaceClass(this.dropStatus, A);
            this.dropStatus = A
        }
    },
    reset: function(A) {
        this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
        this.dropStatus = this.dropNotAllowed;
        if (A) {
            this.ghost.update("")
        }
    },
    update: function(A) {
        if (typeof A == "string") {
            this.ghost.update(A)
        } else {
            this.ghost.update("");
            A.style.margin = "0";
            this.ghost.dom.appendChild(A)
        }
        var B = this.ghost.dom.firstChild;
        if (B) {
            Ext.fly(B).setStyle(Ext.isIE ? "styleFloat": "cssFloat", "none")
        }
    },
    getEl: function() {
        return this.el
    },
    getGhost: function() {
        return this.ghost
    },
    hide: function(A) {
        this.el.hide();
        if (A) {
            this.reset(true)
        }
    },
    stop: function() {
        if (this.anim && this.anim.isAnimated && this.anim.isAnimated()) {
            this.anim.stop()
        }
    },
    show: function() {
        this.el.show()
    },
    sync: function() {
        this.el.sync()
    },
    repair: function(B, C, A) {
        this.callback = C;
        this.scope = A;
        if (B && this.animRepair !== false) {
            this.el.addClass("x-dd-drag-repair");
            this.el.hideUnders(true);
            this.anim = this.el.shift({
                duration: this.repairDuration || 0.5,
                easing: "easeOut",
                xy: B,
                stopFx: true,
                callback: this.afterRepair,
                scope: this
            })
        } else {
            this.afterRepair()
        }
    },
    afterRepair: function() {
        this.hide(true);
        if (typeof this.callback == "function") {
            this.callback.call(this.scope || this)
        }
        this.callback = null;
        this.scope = null
    }
};
Ext.dd.DragSource = function(B, A) {
    this.el = Ext.get(B);
    if (!this.dragData) {
        this.dragData = {}
    }
    Ext.apply(this, A);
    if (!this.proxy) {
        this.proxy = new Ext.dd.StatusProxy()
    }
    Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, {
        dragElId: this.proxy.id,
        resizeFrame: false,
        isTarget: false,
        scroll: this.scroll === true
    });
    this.dragging = false
};
Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
    dropAllowed: "x-dd-drop-ok",
    dropNotAllowed: "x-dd-drop-nodrop",
    getDragData: function(A) {
        return this.dragData
    },
    onDragEnter: function(C, D) {
        var B = Ext.dd.DragDropMgr.getDDById(D);
        this.cachedTarget = B;
        if (this.beforeDragEnter(B, C, D) !== false) {
            if (B.isNotifyTarget) {
                var A = B.notifyEnter(this, C, this.dragData);
                this.proxy.setStatus(A)
            } else {
                this.proxy.setStatus(this.dropAllowed)
            }
            if (this.afterDragEnter) {
                this.afterDragEnter(B, C, D)
            }
        }
    },
    beforeDragEnter: function(B, A, C) {
        return true
    },
    alignElWithMouse: function() {
        Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
        this.proxy.sync()
    },
    onDragOver: function(C, D) {
        var B = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(D);
        if (this.beforeDragOver(B, C, D) !== false) {
            if (B.isNotifyTarget) {
                var A = B.notifyOver(this, C, this.dragData);
                this.proxy.setStatus(A)
            }
            if (this.afterDragOver) {
                this.afterDragOver(B, C, D)
            }
        }
    },
    beforeDragOver: function(B, A, C) {
        return true
    },
    onDragOut: function(B, C) {
        var A = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(C);
        if (this.beforeDragOut(A, B, C) !== false) {
            if (A.isNotifyTarget) {
                A.notifyOut(this, B, this.dragData)
            }
            this.proxy.reset();
            if (this.afterDragOut) {
                this.afterDragOut(A, B, C)
            }
        }
        this.cachedTarget = null
    },
    beforeDragOut: function(B, A, C) {
        return true
    },
    onDragDrop: function(B, C) {
        var A = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(C);
        if (this.beforeDragDrop(A, B, C) !== false) {
            if (A.isNotifyTarget) {
                if (A.notifyDrop(this, B, this.dragData)) {
                    this.onValidDrop(A, B, C)
                } else {
                    this.onInvalidDrop(A, B, C)
                }
            } else {
                this.onValidDrop(A, B, C)
            }
            if (this.afterDragDrop) {
                this.afterDragDrop(A, B, C)
            }
        }
        delete this.cachedTarget
    },
    beforeDragDrop: function(B, A, C) {
        return true
    },
    onValidDrop: function(B, A, C) {
        this.hideProxy();
        if (this.afterValidDrop) {
            this.afterValidDrop(B, A, C)
        }
    },
    getRepairXY: function(B, A) {
        return this.el.getXY()
    },
    onInvalidDrop: function(B, A, C) {
        this.beforeInvalidDrop(B, A, C);
        if (this.cachedTarget) {
            if (this.cachedTarget.isNotifyTarget) {
                this.cachedTarget.notifyOut(this, A, this.dragData)
            }
            this.cacheTarget = null
        }
        this.proxy.repair(this.getRepairXY(A, this.dragData), this.afterRepair, this);
        if (this.afterInvalidDrop) {
            this.afterInvalidDrop(A, C)
        }
    },
    afterRepair: function() {
        if (Ext.enableFx) {
            this.el.highlight(this.hlColor || "c3daf9")
        }
        this.dragging = false
    },
    beforeInvalidDrop: function(B, A, C) {
        return true
    },
    handleMouseDown: function(B) {
        if (this.dragging) {
            return
        }
        var A = this.getDragData(B);
        if (A && this.onBeforeDrag(A, B) !== false) {
            this.dragData = A;
            this.proxy.stop();
            Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments)
        }
    },
    onBeforeDrag: function(A, B) {
        return true
    },
    onStartDrag: Ext.emptyFn,
    startDrag: function(A, B) {
        this.proxy.reset();
        this.dragging = true;
        this.proxy.update("");
        this.onInitDrag(A, B);
        this.proxy.show()
    },
    onInitDrag: function(A, C) {
        var B = this.el.dom.cloneNode(true);
        B.id = Ext.id();
        this.proxy.update(B);
        this.onStartDrag(A, C);
        return true
    },
    getProxy: function() {
        return this.proxy
    },
    hideProxy: function() {
        this.proxy.hide();
        this.proxy.reset(true);
        this.dragging = false
    },
    triggerCacheRefresh: function() {
        Ext.dd.DDM.refreshCache(this.groups)
    },
    b4EndDrag: function(A) {},
    endDrag: function(A) {
        this.onEndDrag(this.dragData, A)
    },
    onEndDrag: function(A, B) {},
    autoOffset: function(A, B) {
        this.setDelta( - 12, -20)
    }
});
Ext.dd.DropTarget = function(B, A) {
    this.el = Ext.get(B);
    Ext.apply(this, A);
    if (this.containerScroll) {
        Ext.dd.ScrollManager.register(this.el)
    }
    Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, {
        isTarget: true
    })
};
Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {
    dropAllowed: "x-dd-drop-ok",
    dropNotAllowed: "x-dd-drop-nodrop",
    isTarget: true,
    isNotifyTarget: true,
    notifyEnter: function(A, C, B) {
        if (this.overClass) {
            this.el.addClass(this.overClass)
        }
        return this.dropAllowed
    },
    notifyOver: function(A, C, B) {
        return this.dropAllowed
    },
    notifyOut: function(A, C, B) {
        if (this.overClass) {
            this.el.removeClass(this.overClass)
        }
    },
    notifyDrop: function(A, C, B) {
        return false
    }
});
Ext.dd.DragZone = function(B, A) {
    Ext.dd.DragZone.superclass.constructor.call(this, B, A);
    if (this.containerScroll) {
        Ext.dd.ScrollManager.register(this.el)
    }
};
Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {
    getDragData: function(A) {
        return Ext.dd.Registry.getHandleFromEvent(A)
    },
    onInitDrag: function(A, B) {
        this.proxy.update(this.dragData.ddel.cloneNode(true));
        this.onStartDrag(A, B);
        return true
    },
    afterRepair: function() {
        if (Ext.enableFx) {
            Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9")
        }
        this.dragging = false
    },
    getRepairXY: function(A) {
        return Ext.Element.fly(this.dragData.ddel).getXY()
    }
});
Ext.dd.DropZone = function(B, A) {
    Ext.dd.DropZone.superclass.constructor.call(this, B, A)
};
Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
    getTargetFromEvent: function(A) {
        return Ext.dd.Registry.getTargetFromEvent(A)
    },
    onNodeEnter: function(D, A, C, B) {},
    onNodeOver: function(D, A, C, B) {
        return this.dropAllowed
    },
    onNodeOut: function(D, A, C, B) {},
    onNodeDrop: function(D, A, C, B) {
        return false
    },
    onContainerOver: function(A, C, B) {
        return this.dropNotAllowed
    },
    onContainerDrop: function(A, C, B) {
        return false
    },
    notifyEnter: function(A, C, B) {
        return this.dropNotAllowed
    },
    notifyOver: function(A, C, B) {
        var D = this.getTargetFromEvent(C);
        if (!D) {
            if (this.lastOverNode) {
                this.onNodeOut(this.lastOverNode, A, C, B);
                this.lastOverNode = null
            }
            return this.onContainerOver(A, C, B)
        }
        if (this.lastOverNode != D) {
            if (this.lastOverNode) {
                this.onNodeOut(this.lastOverNode, A, C, B)
            }
            this.onNodeEnter(D, A, C, B);
            this.lastOverNode = D
        }
        return this.onNodeOver(D, A, C, B)
    },
    notifyOut: function(A, C, B) {
        if (this.lastOverNode) {
            this.onNodeOut(this.lastOverNode, A, C, B);
            this.lastOverNode = null
        }
    },
    notifyDrop: function(A, C, B) {
        if (this.lastOverNode) {
            this.onNodeOut(this.lastOverNode, A, C, B);
            this.lastOverNode = null
        }
        var D = this.getTargetFromEvent(C);
        return D ? this.onNodeDrop(D, A, C, B) : this.onContainerDrop(A, C, B)
    },
    triggerCacheRefresh: function() {
        Ext.dd.DDM.refreshCache(this.groups)
    }
});
Ext.data.SortTypes = {
    none: function(A) {
        return A
    },
    stripTagsRE: /<\/?[^>]+>/gi,
    asText: function(A) {
        return String(A).replace(this.stripTagsRE, "")
    },
    asUCText: function(A) {
        return String(A).toUpperCase().replace(this.stripTagsRE, "")
    },
    asUCString: function(A) {
        return String(A).toUpperCase()
    },
    asDate: function(A) {
        if (!A) {
            return 0
        }
        if (Ext.isDate(A)) {
            return A.getTime()
        }
        return Date.parse(String(A))
    },
    asFloat: function(A) {
        var B = parseFloat(String(A).replace(/,/g, ""));
        if (isNaN(B)) {
            B = 0
        }
        return B
    },
    asInt: function(A) {
        var B = parseInt(String(A).replace(/,/g, ""));
        if (isNaN(B)) {
            B = 0
        }
        return B
    }
};
Ext.data.Record = function(A, B) {
    this.id = (B || B === 0) ? B: ++Ext.data.Record.AUTO_ID;
    this.data = A
};
Ext.data.Record.create = function(E) {
    var C = Ext.extend(Ext.data.Record, {});
    var D = C.prototype;
    D.fields = new Ext.util.MixedCollection(false,
    function(F) {
        return F.name
    });
    for (var B = 0, A = E.length; B < A; B++) {
        D.fields.add(new Ext.data.Field(E[B]))
    }
    C.getField = function(F) {
        return D.fields.get(F)
    };
    return C
};
Ext.data.Record.AUTO_ID = 1000;
Ext.data.Record.EDIT = "edit";
Ext.data.Record.REJECT = "reject";
Ext.data.Record.COMMIT = "commit";
Ext.data.Record.prototype = {
    dirty: false,
    editing: false,
    error: null,
    modified: null,
    join: function(A) {
        this.store = A
    },
    set: function(A, B) {
        if (String(this.data[A]) == String(B)) {
            return
        }
        this.dirty = true;
        if (!this.modified) {
            this.modified = {}
        }
        if (typeof this.modified[A] == "undefined") {
            this.modified[A] = this.data[A]
        }
        this.data[A] = B;
        if (!this.editing && this.store) {
            this.store.afterEdit(this)
        }
    },
    get: function(A) {
        return this.data[A]
    },
    beginEdit: function() {
        this.editing = true;
        this.modified = {}
    },
    cancelEdit: function() {
        this.editing = false;
        delete this.modified
    },
    endEdit: function() {
        this.editing = false;
        if (this.dirty && this.store) {
            this.store.afterEdit(this)
        }
    },
    reject: function(B) {
        var A = this.modified;
        for (var C in A) {
            if (typeof A[C] != "function") {
                this.data[C] = A[C]
            }
        }
        this.dirty = false;
        delete this.modified;
        this.editing = false;
        if (this.store && B !== true) {
            this.store.afterReject(this)
        }
    },
    commit: function(A) {
        this.dirty = false;
        delete this.modified;
        this.editing = false;
        if (this.store && A !== true) {
            this.store.afterCommit(this)
        }
    },
    getChanges: function() {
        var A = this.modified,
        B = {};
        for (var C in A) {
            if (A.hasOwnProperty(C)) {
                B[C] = this.data[C]
            }
        }
        return B
    },
    hasError: function() {
        return this.error != null
    },
    clearError: function() {
        this.error = null
    },
    copy: function(A) {
        return new this.constructor(Ext.apply({},
        this.data), A || this.id)
    },
    isModified: function(A) {
        return !! (this.modified && this.modified.hasOwnProperty(A))
    }
};
Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
    register: function() {
        for (var A = 0, B; B = arguments[A]; A++) {
            this.add(B)
        }
    },
    unregister: function() {
        for (var A = 0, B; B = arguments[A]; A++) {
            this.remove(this.lookup(B))
        }
    },
    lookup: function(A) {
        return typeof A == "object" ? A: this.get(A)
    },
    getKey: function(A) {
        return A.storeId || A.id
    }
});
Ext.data.Store = function(A) {
    this.data = new Ext.util.MixedCollection(false);
    this.data.getKey = function(B) {
        return B.id
    };
    this.baseParams = {};
    this.paramNames = {
        "start": "start",
        "limit": "limit",
        "sort": "sort",
        "dir": "dir"
    };
    if (A && A.data) {
        this.inlineData = A.data;
        delete A.data
    }
    Ext.apply(this, A);
    if (this.url && !this.proxy) {
        this.proxy = new Ext.data.HttpProxy({
            url: this.url
        })
    }
    if (this.reader) {
        if (!this.recordType) {
            this.recordType = this.reader.recordType
        }
        if (this.reader.onMetaChange) {
            this.reader.onMetaChange = this.onMetaChange.createDelegate(this)
        }
    }
    if (this.recordType) {
        this.fields = this.recordType.prototype.fields
    }
    this.modified = [];
    this.addEvents("datachanged", "metachange", "add", "remove", "update", "clear", "beforeload", "load", "loadexception");
    if (this.proxy) {
        this.relayEvents(this.proxy, ["loadexception"])
    }
    this.sortToggle = {};
    if (this.sortInfo) {
        this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction)
    }
    Ext.data.Store.superclass.constructor.call(this);
    if (this.storeId || this.id) {
        Ext.StoreMgr.register(this)
    }
    if (this.inlineData) {
        this.loadData(this.inlineData);
        delete this.inlineData
    } else {
        if (this.autoLoad) {
            this.load.defer(10, this, [typeof this.autoLoad == "object" ? this.autoLoad: undefined])
        }
    }
};
Ext.extend(Ext.data.Store, Ext.util.Observable, {
    remoteSort: false,
    pruneModifiedRecords: false,
    lastOptions: null,
    destroy: function() {
        if (this.id) {
            Ext.StoreMgr.unregister(this)
        }
        this.data = null;
        this.purgeListeners()
    },
    add: function(B) {
        B = [].concat(B);
        if (B.length < 1) {
            return
        }
        for (var D = 0, A = B.length; D < A; D++) {
            B[D].join(this)
        }
        var C = this.data.length;
        this.data.addAll(B);
        if (this.snapshot) {
            this.snapshot.addAll(B)
        }
        this.fireEvent("add", this, B, C)
    },
    addSorted: function(A) {
        var B = this.findInsertIndex(A);
        this.insert(B, A)
    },
    remove: function(A) {
        var B = this.data.indexOf(A);
        this.data.removeAt(B);
        if (this.pruneModifiedRecords) {
            this.modified.remove(A)
        }
        if (this.snapshot) {
            this.snapshot.remove(A)
        }
        this.fireEvent("remove", this, A, B)
    },
    removeAll: function() {
        this.data.clear();
        if (this.snapshot) {
            this.snapshot.clear()
        }
        if (this.pruneModifiedRecords) {
            this.modified = []
        }
        this.fireEvent("clear", this)
    },
    insert: function(C, B) {
        B = [].concat(B);
        for (var D = 0, A = B.length; D < A; D++) {
            this.data.insert(C, B[D]);
            B[D].join(this)
        }
        this.fireEvent("add", this, B, C)
    },
    indexOf: function(A) {
        return this.data.indexOf(A)
    },
    indexOfId: function(A) {
        return this.data.indexOfKey(A)
    },
    getById: function(A) {
        return this.data.key(A)
    },
    getAt: function(A) {
        return this.data.itemAt(A)
    },
    getRange: function(B, A) {
        return this.data.getRange(B, A)
    },
    storeOptions: function(A) {
        A = Ext.apply({},
        A);
        delete A.callback;
        delete A.scope;
        this.lastOptions = A
    },
    load: function(B) {
        B = B || {};
        if (this.fireEvent("beforeload", this, B) !== false) {
            this.storeOptions(B);
            var C = Ext.apply(B.params || {},
            this.baseParams);
            if (this.sortInfo && this.remoteSort) {
                var A = this.paramNames;
                C[A["sort"]] = this.sortInfo.field;
                C[A["dir"]] = this.sortInfo.direction
            }
            this.proxy.load(C, this.reader, this.loadRecords, this, B);
            return true
        } else {
            return false
        }
    },
    reload: function(A) {
        this.load(Ext.applyIf(A || {},
        this.lastOptions))
    },
    loadRecords: function(G, B, F) {
        if (!G || F === false) {
            if (F !== false) {
                this.fireEvent("load", this, [], B)
            }
            if (B.callback) {
                B.callback.call(B.scope || this, [], B, false)
            }
            return
        }
        var E = G.records,
        D = G.totalRecords || E.length;
        if (!B || B.add !== true) {
            if (this.pruneModifiedRecords) {
                this.modified = []
            }
            for (var C = 0, A = E.length; C < A; C++) {
                E[C].join(this)
            }
            if (this.snapshot) {
                this.data = this.snapshot;
                delete this.snapshot
            }
            this.data.clear();
            this.data.addAll(E);
            this.totalLength = D;
            this.applySort();
            this.fireEvent("datachanged", this)
        } else {
            this.totalLength = Math.max(D, this.data.length + E.length);
            this.add(E)
        }
        this.fireEvent("load", this, E, B);
        if (B.callback) {
            B.callback.call(B.scope || this, E, B, true)
        }
    },
    loadData: function(C, A) {
        var B = this.reader.readRecords(C);
        this.loadRecords(B, {
            add: A
        },
        true)
    },
    getCount: function() {
        return this.data.length || 0
    },
    getTotalCount: function() {
        return this.totalLength || 0
    },
    getSortState: function() {
        return this.sortInfo
    },
    applySort: function() {
        if (this.sortInfo && !this.remoteSort) {
            var A = this.sortInfo,
            B = A.field;
            this.sortData(B, A.direction)
        }
    },
    sortData: function(C, D) {
        D = D || "ASC";
        var A = this.fields.get(C).sortType;
        var B = function(F, E) {
            var H = A(F.data[C]),
            G = A(E.data[C]);
            return H > G ? 1 : (H < G ? -1 : 0)
        };
        this.data.sort(D, B);
        if (this.snapshot && this.snapshot != this.data) {
            this.snapshot.sort(D, B)
        }
    },
    setDefaultSort: function(B, A) {
        A = A ? A.toUpperCase() : "ASC";
        this.sortInfo = {
            field: B,
            direction: A
        };
        this.sortToggle[B] = A
    },
    sort: function(E, C) {
        var D = this.fields.get(E);
        if (!D) {
            return false
        }
        if (!C) {
            if (this.sortInfo && this.sortInfo.field == D.name) {
                C = (this.sortToggle[D.name] || "ASC").toggle("ASC", "DESC")
            } else {
                C = D.sortDir
            }
        }
        var B = (this.sortToggle) ? this.sortToggle[D.name] : null;
        var A = (this.sortInfo) ? this.sortInfo: null;
        this.sortToggle[D.name] = C;
        this.sortInfo = {
            field: D.name,
            direction: C
        };
        if (!this.remoteSort) {
            this.applySort();
            this.fireEvent("datachanged", this)
        } else {
            if (!this.load(this.lastOptions)) {
                if (B) {
                    this.sortToggle[D.name] = B
                }
                if (A) {
                    this.sortInfo = A
                }
            }
        }
    },
    each: function(B, A) {
        this.data.each(B, A)
    },
    getModifiedRecords: function() {
        return this.modified
    },
    createFilterFn: function(C, B, D, A) {
        if (Ext.isEmpty(B, false)) {
            return false
        }
        B = this.data.createValueMatcher(B, D, A);
        return function(E) {
            return B.test(E.data[C])
        }
    },
    sum: function(E, F, A) {
        var C = this.data.items,
        B = 0;
        F = F || 0;
        A = (A || A === 0) ? A: C.length - 1;
        for (var D = F; D <= A; D++) {
            B += (C[D].data[E] || 0)
        }
        return B
    },
    filter: function(D, C, E, A) {
        var B = this.createFilterFn(D, C, E, A);
        return B ? this.filterBy(B) : this.clearFilter()
    },
    filterBy: function(B, A) {
        this.snapshot = this.snapshot || this.data;
        this.data = this.queryBy(B, A || this);
        this.fireEvent("datachanged", this)
    },
    query: function(D, C, E, A) {
        var B = this.createFilterFn(D, C, E, A);
        return B ? this.queryBy(B) : this.data.clone()
    },
    queryBy: function(B, A) {
        var C = this.snapshot || this.data;
        return C.filterBy(B, A || this)
    },
    find: function(D, C, F, E, A) {
        var B = this.createFilterFn(D, C, E, A);
        return B ? this.data.findIndexBy(B, null, F) : -1
    },
    findBy: function(B, A, C) {
        return this.data.findIndexBy(B, A, C)
    },
    collect: function(G, H, B) {
        var F = (B === true && this.snapshot) ? this.snapshot.items: this.data.items;
        var I, J, A = [],
        C = {};
        for (var D = 0, E = F.length; D < E; D++) {
            I = F[D].data[G];
            J = String(I);
            if ((H || !Ext.isEmpty(I)) && !C[J]) {
                C[J] = true;
                A[A.length] = I
            }
        }
        return A
    },
    clearFilter: function(A) {
        if (this.isFiltered()) {
            this.data = this.snapshot;
            delete this.snapshot;
            if (A !== true) {
                this.fireEvent("datachanged", this)
            }
        }
    },
    isFiltered: function() {
        return this.snapshot && this.snapshot != this.data
    },
    afterEdit: function(A) {
        if (this.modified.indexOf(A) == -1) {
            this.modified.push(A)
        }
        this.fireEvent("update", this, A, Ext.data.Record.EDIT)
    },
    afterReject: function(A) {
        this.modified.remove(A);
        this.fireEvent("update", this, A, Ext.data.Record.REJECT)
    },
    afterCommit: function(A) {
        this.modified.remove(A);
        this.fireEvent("update", this, A, Ext.data.Record.COMMIT)
    },
    commitChanges: function() {
        var B = this.modified.slice(0);
        this.modified = [];
        for (var C = 0, A = B.length; C < A; C++) {
            B[C].commit()
        }
    },
    rejectChanges: function() {
        var B = this.modified.slice(0);
        this.modified = [];
        for (var C = 0, A = B.length; C < A; C++) {
            B[C].reject()
        }
    },
    onMetaChange: function(B, A, C) {
        this.recordType = A;
        this.fields = A.prototype.fields;
        delete this.snapshot;
        this.sortInfo = B.sortInfo;
        this.modified = [];
        this.fireEvent("metachange", this, this.reader.meta)
    },
    findInsertIndex: function(A) {
        this.suspendEvents();
        var C = this.data.clone();
        this.data.add(A);
        this.applySort();
        var B = this.data.indexOf(A);
        this.data = C;
        this.resumeEvents();
        return B
    }
});
Ext.data.SimpleStore = function(A) {
    Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(A, {
        reader: new Ext.data.ArrayReader({
            id: A.id
        },
        Ext.data.Record.create(A.fields))
    }))
};
Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {
    loadData: function(E, B) {
        if (this.expandData === true) {
            var D = [];
            for (var C = 0, A = E.length; C < A; C++) {
                D[D.length] = [E[C]]
            }
            E = D
        }
        Ext.data.SimpleStore.superclass.loadData.call(this, E, B)
    }
});
Ext.data.JsonStore = function(A) {
    Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(A, {
        proxy: A.proxy || (!A.data ? new Ext.data.HttpProxy({
            url: A.url
        }) : undefined),
        reader: new Ext.data.JsonReader(A, A.fields)
    }))
};
Ext.extend(Ext.data.JsonStore, Ext.data.Store);
Ext.data.Field = function(D) {
    if (typeof D == "string") {
        D = {
            name: D
        }
    }
    Ext.apply(this, D);
    if (!this.type) {
        this.type = "auto"
    }
    var C = Ext.data.SortTypes;
    if (typeof this.sortType == "string") {
        this.sortType = C[this.sortType]
    }
    if (!this.sortType) {
        switch (this.type) {
        case "string":
            this.sortType = C.asUCString;
            break;
        case "date":
            this.sortType = C.asDate;
            break;
        default:
            this.sortType = C.none
        }
    }
    var E = /[\$,%]/g;
    if (!this.convert) {
        var B, A = this.dateFormat;
        switch (this.type) {
        case "":
        case "auto":
        case undefined:
            B = function(F) {
                return F
            };
            break;
        case "string":
            B = function(F) {
                return (F === undefined || F === null) ? "": String(F)
            };
            break;
        case "int":
            B = function(F) {
                return F !== undefined && F !== null && F !== "" ? parseInt(String(F).replace(E, ""), 10) : ""
            };
            break;
        case "float":
            B = function(F) {
                return F !== undefined && F !== null && F !== "" ? parseFloat(String(F).replace(E, ""), 10) : ""
            };
            break;
        case "bool":
        case "boolean":
            B = function(F) {
                return F === true || F === "true" || F == 1
            };
            break;
        case "date":
            B = function(G) {
                if (!G) {
                    return ""
                }
                if (Ext.isDate(G)) {
                    return G
                }
                if (A) {
                    if (A == "timestamp") {
                        return new Date(G * 1000)
                    }
                    if (A == "time") {
                        return new Date(parseInt(G, 10))
                    }
                    return Date.parseDate(G, A)
                }
                var F = Date.parse(G);
                return F ? new Date(F) : null
            };
            break
        }
        this.convert = B
    }
};
Ext.data.Field.prototype = {
    dateFormat: null,
    defaultValue: "",
    mapping: null,
    sortType: null,
    sortDir: "ASC"
};
Ext.data.DataReader = function(A, B) {
    this.meta = A;
    this.recordType = Ext.isArray(B) ? Ext.data.Record.create(B) : B
};
Ext.data.DataReader.prototype = {};
Ext.data.DataProxy = function() {
    this.addEvents("beforeload", "load");
    Ext.data.DataProxy.superclass.constructor.call(this)
};
Ext.extend(Ext.data.DataProxy, Ext.util.Observable);
Ext.data.MemoryProxy = function(A) {
    Ext.data.MemoryProxy.superclass.constructor.call(this);
    this.data = A
};
Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
    load: function(F, C, G, D, B) {
        F = F || {};
        var A;
        try {
            A = C.readRecords(this.data)
        } catch(E) {
            this.fireEvent("loadexception", this, B, null, E);
            G.call(D, null, B, false);
            return
        }
        G.call(D, A, B, true)
    },
    update: function(B, A) {}
});
Ext.data.HttpProxy = function(A) {
    Ext.data.HttpProxy.superclass.constructor.call(this);
    this.conn = A;
    this.useAjax = !A || !A.events
};
Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
    getConnection: function() {
        return this.useAjax ? Ext.Ajax: this.conn
    },
    load: function(E, B, F, C, A) {
        if (this.fireEvent("beforeload", this, E) !== false) {
            var D = {
                params: E || {},
                request: {
                    callback: F,
                    scope: C,
                    arg: A
                },
                reader: B,
                callback: this.loadResponse,
                scope: this
            };
            if (this.useAjax) {
                Ext.applyIf(D, this.conn);
                if (this.activeRequest) {
                    Ext.Ajax.abort(this.activeRequest)
                }
                this.activeRequest = Ext.Ajax.request(D)
            } else {
                this.conn.request(D)
            }
        } else {
            F.call(C || this, null, A, false)
        }
    },
    loadResponse: function(E, D, B) {
        delete this.activeRequest;
        if (!D) {
            this.fireEvent("loadexception", this, E, B);
            E.request.callback.call(E.request.scope, null, E.request.arg, false);
            return
        }
        var A;
        try {
            A = E.reader.read(B)
        } catch(C) {
            this.fireEvent("loadexception", this, E, B, C);
            E.request.callback.call(E.request.scope, null, E.request.arg, false);
            return
        }
        this.fireEvent("load", this, E, E.request.arg);
        E.request.callback.call(E.request.scope, A, E.request.arg, true)
    },
    update: function(A) {},
    updateResponse: function(A) {}
});
Ext.data.ScriptTagProxy = function(A) {
    Ext.data.ScriptTagProxy.superclass.constructor.call(this);
    Ext.apply(this, A);
    this.head = document.getElementsByTagName("head")[0]
};
Ext.data.ScriptTagProxy.TRANS_ID = 1000;
Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
    timeout: 30000,
    callbackParam: "callback",
    nocache: true,
    load: function(E, F, H, I, J) {
        if (this.fireEvent("beforeload", this, E) !== false) {
            var C = Ext.urlEncode(Ext.apply(E, this.extraParams));
            var B = this.url;
            B += (B.indexOf("?") != -1 ? "&": "?") + C;
            if (this.nocache) {
                B += "&_dc=" + (new Date().getTime())
            }
            var A = ++Ext.data.ScriptTagProxy.TRANS_ID;
            var K = {
                id: A,
                cb: "stcCallback" + A,
                scriptId: "stcScript" + A,
                params: E,
                arg: J,
                url: B,
                callback: H,
                scope: I,
                reader: F
            };
            var D = this;
            window[K.cb] = function(L) {
                D.handleResponse(L, K)
            };
            B += String.format("&{0}={1}", this.callbackParam, K.cb);
            if (this.autoAbort !== false) {
                this.abort()
            }
            K.timeoutId = this.handleFailure.defer(this.timeout, this, [K]);
            var G = document.createElement("script");
            G.setAttribute("src", B);
            G.setAttribute("type", "text/javascript");
            G.setAttribute("id", K.scriptId);
            this.head.appendChild(G);
            this.trans = K
        } else {
            H.call(I || this, null, J, false)
        }
    },
    isLoading: function() {
        return this.trans ? true: false
    },
    abort: function() {
        if (this.isLoading()) {
            this.destroyTrans(this.trans)
        }
    },
    destroyTrans: function(B, A) {
        this.head.removeChild(document.getElementById(B.scriptId));
        clearTimeout(B.timeoutId);
        if (A) {
            window[B.cb] = undefined;
            try {
                delete window[B.cb]
            } catch(C) {}
        } else {
            window[B.cb] = function() {
                window[B.cb] = undefined;
                try {
                    delete window[B.cb]
                } catch(D) {}
            }
        }
    },
    handleResponse: function(D, B) {
        this.trans = false;
        this.destroyTrans(B, true);
        var A;
        try {
            A = B.reader.readRecords(D)
        } catch(C) {
            this.fireEvent("loadexception", this, D, B.arg, C);
            B.callback.call(B.scope || window, null, B.arg, false);
            return
        }
        this.fireEvent("load", this, D, B.arg);
        B.callback.call(B.scope || window, A, B.arg, true)
    },
    handleFailure: function(A) {
        this.trans = false;
        this.destroyTrans(A, false);
        this.fireEvent("loadexception", this, null, A.arg);
        A.callback.call(A.scope || window, null, A.arg, false)
    }
});
Ext.data.JsonReader = function(A, B) {
    A = A || {};
    Ext.data.JsonReader.superclass.constructor.call(this, A, B || A.fields)
};
Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
    read: function(response) {
        var json = response.responseText;
        var o = eval("(" + json + ")");
        if (!o) {
            throw {
                message: "JsonReader.read: Json object not found"
            }
        }
        return this.readRecords(o)
    },
    onMetaChange: function(A, C, B) {},
    simpleAccess: function(B, A) {
        return B[A]
    },
    getJsonAccessor: function() {
        var A = /[\[\.]/;
        return function(C) {
            try {
                return (A.test(C)) ? new Function("obj", "return obj." + C) : function(D) {
                    return D[C]
                }
            } catch(B) {}
            return Ext.emptyFn
        }
    } (),
    readRecords: function(K) {
        this.jsonData = K;
        if (K.metaData) {
            delete this.ef;
            this.meta = K.metaData;
            this.recordType = Ext.data.Record.create(K.metaData.fields);
            this.onMetaChange(this.meta, this.recordType, K)
        }
        var H = this.meta,
        A = this.recordType,
        R = A.prototype.fields,
        F = R.items,
        E = R.length;
        if (!this.ef) {
            if (H.totalProperty) {
                this.getTotal = this.getJsonAccessor(H.totalProperty)
            }
            if (H.successProperty) {
                this.getSuccess = this.getJsonAccessor(H.successProperty)
            }
            this.getRoot = H.root ? this.getJsonAccessor(H.root) : function(U) {
                return U
            };
            if (H.id) {
                var Q = this.getJsonAccessor(H.id);
                this.getId = function(V) {
                    var U = Q(V);
                    return (U === undefined || U === "") ? null: U
                }
            } else {
                this.getId = function() {
                    return null
                }
            }
            this.ef = [];
            for (var O = 0; O < E; O++) {
                R = F[O];
                var T = (R.mapping !== undefined && R.mapping !== null) ? R.mapping: R.name;
                this.ef[O] = this.getJsonAccessor(T)
            }
        }
        var M = this.getRoot(K),
        S = M.length,
        I = S,
        D = true;
        if (H.totalProperty) {
            var G = parseInt(this.getTotal(K), 10);
            if (!isNaN(G)) {
                I = G
            }
        }
        if (H.successProperty) {
            var G = this.getSuccess(K);
            if (G === false || G === "false") {
                D = false
            }
        }
        var P = [];
        for (var O = 0; O < S; O++) {
            var L = M[O];
            var B = {};
            var J = this.getId(L);
            for (var N = 0; N < E; N++) {
                R = F[N];
                var G = this.ef[N](L);
                B[R.name] = R.convert((G !== undefined) ? G: R.defaultValue, L)
            }
            var C = new A(B, J);
            C.json = L;
            P[O] = C
        }
        return {
            success: D,
            records: P,
            totalRecords: I
        }
    }
});
Ext.data.XmlReader = function(A, B) {
    A = A || {};
    Ext.data.XmlReader.superclass.constructor.call(this, A, B || A.fields)
};
Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
    read: function(A) {
        var B = A.responseXML;
        if (!B) {
            throw {
                message: "XmlReader.read: XML Document not available"
            }
        }
        return this.readRecords(B)
    },
    readRecords: function(T) {
        this.xmlData = T;
        var N = T.documentElement || T;
        var I = Ext.DomQuery;
        var B = this.recordType,
        L = B.prototype.fields;
        var D = this.meta.id;
        var G = 0,
        E = true;
        if (this.meta.totalRecords) {
            G = I.selectNumber(this.meta.totalRecords, N, 0)
        }
        if (this.meta.success) {
            var K = I.selectValue(this.meta.success, N, true);
            E = K !== false && K !== "false"
        }
        var Q = [];
        var U = I.select(this.meta.record, N);
        for (var P = 0, R = U.length; P < R; P++) {
            var M = U[P];
            var A = {};
            var J = D ? I.selectValue(D, M) : undefined;
            for (var O = 0, H = L.length; O < H; O++) {
                var S = L.items[O];
                var F = I.selectValue(S.mapping || S.name, M, S.defaultValue);
                F = S.convert(F, M);
                A[S.name] = F
            }
            var C = new B(A, J);
            C.node = M;
            Q[Q.length] = C
        }
        return {
            success: E,
            records: Q,
            totalRecords: G || Q.length
        }
    }
});
Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
    readRecords: function(C) {
        var B = this.meta ? this.meta.id: null;
        var G = this.recordType,
        K = G.prototype.fields;
        var E = [];
        var M = C;
        for (var I = 0; I < M.length; I++) {
            var D = M[I];
            var O = {};
            var A = ((B || B === 0) && D[B] !== undefined && D[B] !== "" ? D[B] : null);
            for (var H = 0, P = K.length; H < P; H++) {
                var L = K.items[H];
                var F = L.mapping !== undefined && L.mapping !== null ? L.mapping: H;
                var N = D[F] !== undefined ? D[F] : L.defaultValue;
                N = L.convert(N, D);
                O[L.name] = N
            }
            var J = new G(O, A);
            J.json = D;
            E[E.length] = J
        }
        return {
            records: E,
            totalRecords: E.length
        }
    }
});
Ext.data.Tree = function(A) {
    this.nodeHash = {};
    this.root = null;
    if (A) {
        this.setRootNode(A)
    }
    this.addEvents("append", "remove", "move", "insert", "beforeappend", "beforeremove", "beforemove", "beforeinsert");
    Ext.data.Tree.superclass.constructor.call(this)
};
Ext.extend(Ext.data.Tree, Ext.util.Observable, {
    pathSeparator: "/",
    proxyNodeEvent: function() {
        return this.fireEvent.apply(this, arguments)
    },
    getRootNode: function() {
        return this.root
    },
    setRootNode: function(A) {
        this.root = A;
        A.ownerTree = this;
        A.isRoot = true;
        this.registerNode(A);
        return A
    },
    getNodeById: function(A) {
        return this.nodeHash[A]
    },
    registerNode: function(A) {
        this.nodeHash[A.id] = A
    },
    unregisterNode: function(A) {
        delete this.nodeHash[A.id]
    },
    toString: function() {
        return "[Tree" + (this.id ? " " + this.id: "") + "]"
    }
});
Ext.data.Node = function(A) {
    this.attributes = A || {};
    this.leaf = this.attributes.leaf;
    this.id = this.attributes.id;
    if (!this.id) {
        this.id = Ext.id(null, "ynode-");
        this.attributes.id = this.id
    }
    this.childNodes = [];
    if (!this.childNodes.indexOf) {
        this.childNodes.indexOf = function(D) {
            for (var C = 0, B = this.length; C < B; C++) {
                if (this[C] == D) {
                    return C
                }
            }
            return - 1
        }
    }
    this.parentNode = null;
    this.firstChild = null;
    this.lastChild = null;
    this.previousSibling = null;
    this.nextSibling = null;
    this.addEvents({
        "append": true,
        "remove": true,
        "move": true,
        "insert": true,
        "beforeappend": true,
        "beforeremove": true,
        "beforemove": true,
        "beforeinsert": true
    });
    this.listeners = this.attributes.listeners;
    Ext.data.Node.superclass.constructor.call(this)
};
Ext.extend(Ext.data.Node, Ext.util.Observable, {
    fireEvent: function(B) {
        if (Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false) {
            return false
        }
        var A = this.getOwnerTree();
        if (A) {
            if (A.proxyNodeEvent.apply(A, arguments) === false) {
                return false
            }
        }
        return true
    },
    isLeaf: function() {
        return this.leaf === true
    },
    setFirstChild: function(A) {
        this.firstChild = A
    },
    setLastChild: function(A) {
        this.lastChild = A
    },
    isLast: function() {
        return (!this.parentNode ? true: this.parentNode.lastChild == this)
    },
    isFirst: function() {
        return (!this.parentNode ? true: this.parentNode.firstChild == this)
    },
    hasChildNodes: function() {
        return ! this.isLeaf() && this.childNodes.length > 0
    },
    isExpandable: function() {
        return this.attributes.expandable || this.hasChildNodes()
    },
    appendChild: function(E) {
        var F = false;
        if (Ext.isArray(E)) {
            F = E
        } else {
            if (arguments.length > 1) {
                F = arguments
            }
        }
        if (F) {
            for (var D = 0, A = F.length; D < A; D++) {
                this.appendChild(F[D])
            }
        } else {
            if (this.fireEvent("beforeappend", this.ownerTree, this, E) === false) {
                return false
            }
            var B = this.childNodes.length;
            var C = E.parentNode;
            if (C) {
                if (E.fireEvent("beforemove", E.getOwnerTree(), E, C, this, B) === false) {
                    return false
                }
                C.removeChild(E)
            }
            B = this.childNodes.length;
            if (B == 0) {
                this.setFirstChild(E)
            }
            this.childNodes.push(E);
            E.parentNode = this;
            var G = this.childNodes[B - 1];
            if (G) {
                E.previousSibling = G;
                G.nextSibling = E
            } else {
                E.previousSibling = null
            }
            E.nextSibling = null;
            this.setLastChild(E);
            E.setOwnerTree(this.getOwnerTree());
            this.fireEvent("append", this.ownerTree, this, E, B);
            if (C) {
                E.fireEvent("move", this.ownerTree, E, C, this, B)
            }
            return E
        }
    },
    removeChild: function(B) {
        var A = this.childNodes.indexOf(B);
        if (A == -1) {
            return false
        }
        if (this.fireEvent("beforeremove", this.ownerTree, this, B) === false) {
            return false
        }
        this.childNodes.splice(A, 1);
        if (B.previousSibling) {
            B.previousSibling.nextSibling = B.nextSibling
        }
        if (B.nextSibling) {
            B.nextSibling.previousSibling = B.previousSibling
        }
        if (this.firstChild == B) {
            this.setFirstChild(B.nextSibling)
        }
        if (this.lastChild == B) {
            this.setLastChild(B.previousSibling)
        }
        B.setOwnerTree(null);
        B.parentNode = null;
        B.previousSibling = null;
        B.nextSibling = null;
        this.fireEvent("remove", this.ownerTree, this, B);
        return B
    },
    insertBefore: function(D, A) {
        if (!A) {
            return this.appendChild(D)
        }
        if (D == A) {
            return false
        }
        if (this.fireEvent("beforeinsert", this.ownerTree, this, D, A) === false) {
            return false
        }
        var B = this.childNodes.indexOf(A);
        var C = D.parentNode;
        var E = B;
        if (C == this && this.childNodes.indexOf(D) < B) {
            E--
        }
        if (C) {
            if (D.fireEvent("beforemove", D.getOwnerTree(), D, C, this, B, A) === false) {
                return false
            }
            C.removeChild(D)
        }
        if (E == 0) {
            this.setFirstChild(D)
        }
        this.childNodes.splice(E, 0, D);
        D.parentNode = this;
        var F = this.childNodes[E - 1];
        if (F) {
            D.previousSibling = F;
            F.nextSibling = D
        } else {
            D.previousSibling = null
        }
        D.nextSibling = A;
        A.previousSibling = D;
        D.setOwnerTree(this.getOwnerTree());
        this.fireEvent("insert", this.ownerTree, this, D, A);
        if (C) {
            D.fireEvent("move", this.ownerTree, D, C, this, E, A)
        }
        return D
    },
    remove: function() {
        this.parentNode.removeChild(this);
        return this
    },
    item: function(A) {
        return this.childNodes[A]
    },
    replaceChild: function(A, B) {
        this.insertBefore(A, B);
        this.removeChild(B);
        return B
    },
    indexOf: function(A) {
        return this.childNodes.indexOf(A)
    },
    getOwnerTree: function() {
        if (!this.ownerTree) {
            var A = this;
            while (A) {
                if (A.ownerTree) {
                    this.ownerTree = A.ownerTree;
                    break
                }
                A = A.parentNode
            }
        }
        return this.ownerTree
    },
    getDepth: function() {
        var B = 0;
        var A = this;
        while (A.parentNode) {++B;
            A = A.parentNode
        }
        return B
    },
    setOwnerTree: function(B) {
        if (B != this.ownerTree) {
            if (this.ownerTree) {
                this.ownerTree.unregisterNode(this)
            }
            this.ownerTree = B;
            var D = this.childNodes;
            for (var C = 0, A = D.length; C < A; C++) {
                D[C].setOwnerTree(B)
            }
            if (B) {
                B.registerNode(this)
            }
        }
    },
    getPath: function(B) {
        B = B || "id";
        var D = this.parentNode;
        var A = [this.attributes[B]];
        while (D) {
            A.unshift(D.attributes[B]);
            D = D.parentNode
        }
        var C = this.getOwnerTree().pathSeparator;
        return C + A.join(C)
    },
    bubble: function(C, B, A) {
        var D = this;
        while (D) {
            if (C.apply(B || D, A || [D]) === false) {
                break
            }
            D = D.parentNode
        }
    },
    cascade: function(F, E, B) {
        if (F.apply(E || this, B || [this]) !== false) {
            var D = this.childNodes;
            for (var C = 0, A = D.length; C < A; C++) {
                D[C].cascade(F, E, B)
            }
        }
    },
    eachChild: function(F, E, B) {
        var D = this.childNodes;
        for (var C = 0, A = D.length; C < A; C++) {
            if (F.apply(E || this, B || [D[C]]) === false) {
                break
            }
        }
    },
    findChild: function(D, E) {
        var C = this.childNodes;
        for (var B = 0, A = C.length; B < A; B++) {
            if (C[B].attributes[D] == E) {
                return C[B]
            }
        }
        return null
    },
    findChildBy: function(E, D) {
        var C = this.childNodes;
        for (var B = 0, A = C.length; B < A; B++) {
            if (E.call(D || C[B], C[B]) === true) {
                return C[B]
            }
        }
        return null
    },
    sort: function(E, D) {
        var C = this.childNodes;
        var A = C.length;
        if (A > 0) {
            var F = D ?
            function() {
                E.apply(D, arguments)
            }: E;
            C.sort(F);
            for (var B = 0; B < A; B++) {
                var G = C[B];
                G.previousSibling = C[B - 1];
                G.nextSibling = C[B + 1];
                if (B == 0) {
                    this.setFirstChild(G)
                }
                if (B == A - 1) {
                    this.setLastChild(G)
                }
            }
        }
    },
    contains: function(A) {
        return A.isAncestor(this)
    },
    isAncestor: function(A) {
        var B = this.parentNode;
        while (B) {
            if (B == A) {
                return true
            }
            B = B.parentNode
        }
        return false
    },
    toString: function() {
        return "[Node" + (this.id ? " " + this.id: "") + "]"
    }
});
Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
    remoteGroup: false,
    groupOnSort: false,
    clearGrouping: function() {
        this.groupField = false;
        if (this.remoteGroup) {
            if (this.baseParams) {
                delete this.baseParams.groupBy
            }
            this.reload()
        } else {
            this.applySort();
            this.fireEvent("datachanged", this)
        }
    },
    groupBy: function(C, B) {
        if (this.groupField == C && !B) {
            return
        }
        this.groupField = C;
        if (this.remoteGroup) {
            if (!this.baseParams) {
                this.baseParams = {}
            }
            this.baseParams["groupBy"] = C
        }
        if (this.groupOnSort) {
            this.sort(C);
            return
        }
        if (this.remoteGroup) {
            this.reload()
        } else {
            var A = this.sortInfo || {};
            if (A.field != C) {
                this.applySort()
            } else {
                this.sortData(C)
            }
            this.fireEvent("datachanged", this)
        }
    },
    applySort: function() {
        Ext.data.GroupingStore.superclass.applySort.call(this);
        if (!this.groupOnSort && !this.remoteGroup) {
            var A = this.getGroupState();
            if (A && A != this.sortInfo.field) {
                this.sortData(this.groupField)
            }
        }
    },
    applyGrouping: function(A) {
        if (this.groupField !== false) {
            this.groupBy(this.groupField, true);
            return true
        } else {
            if (A === true) {
                this.fireEvent("datachanged", this)
            }
            return false
        }
    },
    getGroupState: function() {
        return this.groupOnSort && this.groupField !== false ? (this.sortInfo ? this.sortInfo.field: undefined) : this.groupField
    }
});
Ext.ComponentMgr = function() {
    var B = new Ext.util.MixedCollection();
    var A = {};
    return {
        register: function(C) {
            B.add(C)
        },
        unregister: function(C) {
            B.remove(C)
        },
        get: function(C) {
            return B.get(C)
        },
        onAvailable: function(E, D, C) {
            B.on("add",
            function(F, G) {
                if (G.id == E) {
                    D.call(C || G, G);
                    B.un("add", D, C)
                }
            })
        },
        all: B,
        registerType: function(D, C) {
            A[D] = C;
            C.xtype = D
        },
        create: function(C, D) {
            return new A[C.xtype || D](C)
        }
    }
} ();
Ext.reg = Ext.ComponentMgr.registerType;
Ext.Component = function(B) {
    B = B || {};
    if (B.initialConfig) {
        if (B.isAction) {
            this.baseAction = B
        }
        B = B.initialConfig
    } else {
        if (B.tagName || B.dom || typeof B == "string") {
            B = {
                applyTo: B,
                id: B.id || B
            }
        }
    }
    this.initialConfig = B;
    Ext.apply(this, B);
    this.addEvents("disable", "enable", "beforeshow", "show", "beforehide", "hide", "beforerender", "render", "beforedestroy", "destroy", "beforestaterestore", "staterestore", "beforestatesave", "statesave");
    this.getId();
    Ext.ComponentMgr.register(this);
    Ext.Component.superclass.constructor.call(this);
    if (this.baseAction) {
        this.baseAction.addComponent(this)
    }
    this.initComponent();
    if (this.plugins) {
        if (Ext.isArray(this.plugins)) {
            for (var C = 0, A = this.plugins.length; C < A; C++) {
                this.plugins[C] = this.initPlugin(this.plugins[C])
            }
        } else {
            this.plugins = this.initPlugin(this.plugins)
        }
    }
    if (this.stateful !== false) {
        this.initState(B)
    }
    if (this.applyTo) {
        this.applyToMarkup(this.applyTo);
        delete this.applyTo
    } else {
        if (this.renderTo) {
            this.render(this.renderTo);
            delete this.renderTo
        }
    }
};
Ext.Component.AUTO_ID = 1000;
Ext.extend(Ext.Component, Ext.util.Observable, {
    disabledClass: "x-item-disabled",
    allowDomMove: true,
    autoShow: false,
    hideMode: "display",
    hideParent: false,
    hidden: false,
    disabled: false,
    rendered: false,
    ctype: "Ext.Component",
    actionMode: "el",
    getActionEl: function() {
        return this[this.actionMode]
    },
    initPlugin: function(A) {
        A.init(this);
        return A
    },
    initComponent: Ext.emptyFn,
    render: function(B, A) {
        if (!this.rendered && this.fireEvent("beforerender", this) !== false) {
            if (!B && this.el) {
                this.el = Ext.get(this.el);
                B = this.el.dom.parentNode;
                this.allowDomMove = false
            }
            this.container = Ext.get(B);
            if (this.ctCls) {
                this.container.addClass(this.ctCls)
            }
            this.rendered = true;
            if (A !== undefined) {
                if (typeof A == "number") {
                    A = this.container.dom.childNodes[A]
                } else {
                    A = Ext.getDom(A)
                }
            }
            this.onRender(this.container, A || null);
            if (this.autoShow) {
                this.el.removeClass(["x-hidden", "x-hide-" + this.hideMode])
            }
            if (this.cls) {
                this.el.addClass(this.cls);
                delete this.cls
            }
            if (this.style) {
                this.el.applyStyles(this.style);
                delete this.style
            }
            this.fireEvent("render", this);
            this.afterRender(this.container);
            if (this.hidden) {
                this.hide()
            }
            if (this.disabled) {
                this.disable()
            }
            if (this.stateful !== false) {
                this.initStateEvents()
            }
        }
        return this
    },
    initState: function(A) {
        if (Ext.state.Manager) {
            var B = Ext.state.Manager.get(this.stateId || this.id);
            if (B) {
                if (this.fireEvent("beforestaterestore", this, B) !== false) {
                    this.applyState(B);
                    this.fireEvent("staterestore", this, B)
                }
            }
        }
    },
    initStateEvents: function() {
        if (this.stateEvents) {
            for (var A = 0, B; B = this.stateEvents[A]; A++) {
                this.on(B, this.saveState, this, {
                    delay: 100
                })
            }
        }
    },
    applyState: function(B, A) {
        if (B) {
            Ext.apply(this, B)
        }
    },
    getState: function() {
        return null
    },
    saveState: function() {
        if (Ext.state.Manager) {
            var A = this.getState();
            if (this.fireEvent("beforestatesave", this, A) !== false) {
                Ext.state.Manager.set(this.stateId || this.id, A);
                this.fireEvent("statesave", this, A)
            }
        }
    },
    applyToMarkup: function(A) {
        this.allowDomMove = false;
        this.el = Ext.get(A);
        this.render(this.el.dom.parentNode)
    },
    addClass: function(A) {
        if (this.el) {
            this.el.addClass(A)
        } else {
            this.cls = this.cls ? this.cls + " " + A: A
        }
    },
    removeClass: function(A) {
        if (this.el) {
            this.el.removeClass(A)
        } else {
            if (this.cls) {
                this.cls = this.cls.split(" ").remove(A).join(" ")
            }
        }
    },
    onRender: function(B, A) {
        if (this.autoEl) {
            if (typeof this.autoEl == "string") {
                this.el = document.createElement(this.autoEl)
            } else {
                var C = document.createElement("div");
                Ext.DomHelper.overwrite(C, this.autoEl);
                this.el = C.firstChild
            }
            if (!this.el.id) {
                this.el.id = this.getId()
            }
        }
        if (this.el) {
            this.el = Ext.get(this.el);
            if (this.allowDomMove !== false) {
                B.dom.insertBefore(this.el.dom, A)
            }
            if (this.overCls) {
                this.el.addClassOnOver(this.overCls)
            }
        }
    },
    getAutoCreate: function() {
        var A = typeof this.autoCreate == "object" ? this.autoCreate: Ext.apply({},
        this.defaultAutoCreate);
        if (this.id && !A.id) {
            A.id = this.id
        }
        return A
    },
    afterRender: Ext.emptyFn,
    destroy: function() {
        if (this.fireEvent("beforedestroy", this) !== false) {
            this.beforeDestroy();
            if (this.rendered) {
                this.el.removeAllListeners();
                this.el.remove();
                if (this.actionMode == "container") {
                    this.container.remove()
                }
            }
            this.onDestroy();
            Ext.ComponentMgr.unregister(this);
            this.fireEvent("destroy", this);
            this.purgeListeners()
        }
    },
    beforeDestroy: Ext.emptyFn,
    onDestroy: Ext.emptyFn,
    getEl: function() {
        return this.el
    },
    getId: function() {
        return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID))
    },
    getItemId: function() {
        return this.itemId || this.getId()
    },
    focus: function(B, A) {
        if (A) {
            this.focus.defer(typeof A == "number" ? A: 10, this, [B, false]);
            return
        }
        if (this.rendered) {
            this.el.focus();
            if (B === true) {
                this.el.dom.select()
            }
        }
        return this
    },
    blur: function() {
        if (this.rendered) {
            this.el.blur()
        }
        return this
    },
    disable: function() {
        if (this.rendered) {
            this.onDisable()
        }
        this.disabled = true;
        this.fireEvent("disable", this);
        return this
    },
    onDisable: function() {
        this.getActionEl().addClass(this.disabledClass);
        this.el.dom.disabled = true
    },
    enable: function() {
        if (this.rendered) {
            this.onEnable()
        }
        this.disabled = false;
        this.fireEvent("enable", this);
        return this
    },
    onEnable: function() {
        this.getActionEl().removeClass(this.disabledClass);
        this.el.dom.disabled = false
    },
    setDisabled: function(A) {
        this[A ? "disable": "enable"]()
    },
    show: function() {
        if (this.fireEvent("beforeshow", this) !== false) {
            this.hidden = false;
            if (this.autoRender) {
                this.render(typeof this.autoRender == "boolean" ? Ext.getBody() : this.autoRender)
            }
            if (this.rendered) {
                this.onShow()
            }
            this.fireEvent("show", this)
        }
        return this
    },
    onShow: function() {
        if (this.hideParent) {
            this.container.removeClass("x-hide-" + this.hideMode)
        } else {
            this.getActionEl().removeClass("x-hide-" + this.hideMode)
        }
    },
    hide: function() {
        if (this.fireEvent("beforehide", this) !== false) {
            this.hidden = true;
            if (this.rendered) {
                this.onHide()
            }
            this.fireEvent("hide", this)
        }
        return this
    },
    onHide: function() {
        if (this.hideParent) {
            this.container.addClass("x-hide-" + this.hideMode)
        } else {
            this.getActionEl().addClass("x-hide-" + this.hideMode)
        }
    },
    setVisible: function(A) {
        if (A) {
            this.show()
        } else {
            this.hide()
        }
        return this
    },
    isVisible: function() {
        return this.rendered && this.getActionEl().isVisible()
    },
    cloneConfig: function(B) {
        B = B || {};
        var C = B.id || Ext.id();
        var A = Ext.applyIf(B, this.initialConfig);
        A.id = C;
        return new this.constructor(A)
    },
    getXType: function() {
        return this.constructor.xtype
    },
    isXType: function(B, A) {
        return ! A ? ("/" + this.getXTypes() + "/").indexOf("/" + B + "/") != -1 : this.constructor.xtype == B
    },
    getXTypes: function() {
        var A = this.constructor;
        if (!A.xtypes) {
            var C = [],
            B = this;
            while (B && B.constructor.xtype) {
                C.unshift(B.constructor.xtype);
                B = B.constructor.superclass
            }
            A.xtypeChain = C;
            A.xtypes = C.join("/")
        }
        return A.xtypes
    },
    findParentBy: function(A) {
        for (var B = this.ownerCt;
        (B != null) && !A(B, this); B = B.ownerCt) {}
        return B || null
    },
    findParentByType: function(A) {
        return typeof A == "function" ? this.findParentBy(function(B) {
            return B.constructor === A
        }) : this.findParentBy(function(B) {
            return B.constructor.xtype === A
        })
    },
    mon: function(E, B, D, C, A) {
        if (!this.mons) {
            this.mons = [];
            this.on("beforedestroy",
            function() {
                for (var H = 0, G = this.mons.length; H < G; H++) {
                    var F = this.mons[H];
                    F.item.un(F.ename, F.fn, F.scope)
                }
            },
            this)
        }
        this.mons.push({
            item: E,
            ename: B,
            fn: D,
            scope: C
        });
        E.on(B, D, C, A)
    }
});
Ext.reg("component", Ext.Component);
Ext.Action = function(A) {
    this.initialConfig = A;
    this.items = []
};
Ext.Action.prototype = {
    isAction: true,
    setText: function(A) {
        this.initialConfig.text = A;
        this.callEach("setText", [A])
    },
    getText: function() {
        return this.initialConfig.text
    },
    setIconClass: function(A) {
        this.initialConfig.iconCls = A;
        this.callEach("setIconClass", [A])
    },
    getIconClass: function() {
        return this.initialConfig.iconCls
    },
    setDisabled: function(A) {
        this.initialConfig.disabled = A;
        this.callEach("setDisabled", [A])
    },
    enable: function() {
        this.setDisabled(false)
    },
    disable: function() {
        this.setDisabled(true)
    },
    isDisabled: function() {
        return this.initialConfig.disabled
    },
    setHidden: function(A) {
        this.initialConfig.hidden = A;
        this.callEach("setVisible", [!A])
    },
    show: function() {
        this.setHidden(false)
    },
    hide: function() {
        this.setHidden(true)
    },
    isHidden: function() {
        return this.initialConfig.hidden
    },
    setHandler: function(B, A) {
        this.initialConfig.handler = B;
        this.initialConfig.scope = A;
        this.callEach("setHandler", [B, A])
    },
    each: function(B, A) {
        Ext.each(this.items, B, A)
    },
    callEach: function(E, B) {
        var D = this.items;
        for (var C = 0, A = D.length; C < A; C++) {
            D[C][E].apply(D[C], B)
        }
    },
    addComponent: function(A) {
        this.items.push(A);
        A.on("destroy", this.removeComponent, this)
    },
    removeComponent: function(A) {
        this.items.remove(A)
    },
    execute: function() {
        this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments)
    }
};
(function() {
    Ext.Layer = function(D, C) {
        D = D || {};
        var E = Ext.DomHelper;
        var G = D.parentEl,
        F = G ? Ext.getDom(G) : document.body;
        if (C) {
            this.dom = Ext.getDom(C)
        }
        if (!this.dom) {
            var H = D.dh || {
                tag: "div",
                cls: "x-layer"
            };
            this.dom = E.append(F, H)
        }
        if (D.cls) {
            this.addClass(D.cls)
        }
        this.constrain = D.constrain !== false;
        this.visibilityMode = Ext.Element.VISIBILITY;
        if (D.id) {
            this.id = this.dom.id = D.id
        } else {
            this.id = Ext.id(this.dom)
        }
        this.zindex = D.zindex || this.getZIndex();
        this.position("absolute", this.zindex);
        if (D.shadow) {
            this.shadowOffset = D.shadowOffset || 4;
            this.shadow = new Ext.Shadow({
                offset: this.shadowOffset,
                mode: D.shadow
            })
        } else {
            this.shadowOffset = 0
        }
        this.useShim = D.shim !== false && Ext.useShims;
        this.useDisplay = D.useDisplay;
        this.hide()
    };
    var A = Ext.Element.prototype;
    var B = [];
    Ext.extend(Ext.Layer, Ext.Element, {
        getZIndex: function() {
            return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000
        },
        getShim: function() {
            if (!this.useShim) {
                return null
            }
            if (this.shim) {
                return this.shim
            }
            var D = B.shift();
            if (!D) {
                D = this.createShim();
                D.enableDisplayMode("block");
                D.dom.style.display = "none";
                D.dom.style.visibility = "visible"
            }
            var C = this.dom.parentNode;
            if (D.dom.parentNode != C) {
                C.insertBefore(D.dom, this.dom)
            }
            D.setStyle("z-index", this.getZIndex() - 2);
            this.shim = D;
            return D
        },
        hideShim: function() {
            if (this.shim) {
                this.shim.setDisplayed(false);
                B.push(this.shim);
                delete this.shim
            }
        },
        disableShadow: function() {
            if (this.shadow) {
                this.shadowDisabled = true;
                this.shadow.hide();
                this.lastShadowOffset = this.shadowOffset;
                this.shadowOffset = 0
            }
        },
        enableShadow: function(C) {
            if (this.shadow) {
                this.shadowDisabled = false;
                this.shadowOffset = this.lastShadowOffset;
                delete this.lastShadowOffset;
                if (C) {
                    this.sync(true)
                }
            }
        },
        sync: function(C) {
            var I = this.shadow;
            if (!this.updating && this.isVisible() && (I || this.useShim)) {
                var F = this.getShim();
                var H = this.getWidth(),
                E = this.getHeight();
                var D = this.getLeft(true),
                J = this.getTop(true);
                if (I && !this.shadowDisabled) {
                    if (C && !I.isVisible()) {
                        I.show(this)
                    } else {
                        I.realign(D, J, H, E)
                    }
                    if (F) {
                        if (C) {
                            F.show()
                        }
                        var G = I.adjusts,
                        K = F.dom.style;
                        K.left = (Math.min(D, D + G.l)) + "px";
                        K.top = (Math.min(J, J + G.t)) + "px";
                        K.width = (H + G.w) + "px";
                        K.height = (E + G.h) + "px"
                    }
                } else {
                    if (F) {
                        if (C) {
                            F.show()
                        }
                        F.setSize(H, E);
                        F.setLeftTop(D, J)
                    }
                }
            }
        },
        destroy: function() {
            this.hideShim();
            if (this.shadow) {
                this.shadow.hide()
            }
            this.removeAllListeners();
            Ext.removeNode(this.dom);
            Ext.Element.uncache(this.id)
        },
        remove: function() {
            this.destroy()
        },
        beginUpdate: function() {
            this.updating = true
        },
        endUpdate: function() {
            this.updating = false;
            this.sync(true)
        },
        hideUnders: function(C) {
            if (this.shadow) {
                this.shadow.hide()
            }
            this.hideShim()
        },
        constrainXY: function() {
            if (this.constrain) {
                var G = Ext.lib.Dom.getViewWidth(),
                C = Ext.lib.Dom.getViewHeight();
                var L = Ext.getDoc().getScroll();
                var K = this.getXY();
                var H = K[0],
                F = K[1];
                var I = this.dom.offsetWidth + this.shadowOffset,
                D = this.dom.offsetHeight + this.shadowOffset;
                var E = false;
                if ((H + I) > G + L.left) {
                    H = G - I - this.shadowOffset;
                    E = true
                }
                if ((F + D) > C + L.top) {
                    F = C - D - this.shadowOffset;
                    E = true
                }
                if (H < L.left) {
                    H = L.left;
                    E = true
                }
                if (F < L.top) {
                    F = L.top;
                    E = true
                }
                if (E) {
                    if (this.avoidY) {
                        var J = this.avoidY;
                        if (F <= J && (F + D) >= J) {
                            F = J - D - 5
                        }
                    }
                    K = [H, F];
                    this.storeXY(K);
                    A.setXY.call(this, K);
                    this.sync()
                }
            }
        },
        isVisible: function() {
            return this.visible
        },
        showAction: function() {
            this.visible = true;
            if (this.useDisplay === true) {
                this.setDisplayed("")
            } else {
                if (this.lastXY) {
                    A.setXY.call(this, this.lastXY)
                } else {
                    if (this.lastLT) {
                        A.setLeftTop.call(this, this.lastLT[0], this.lastLT[1])
                    }
                }
            }
        },
        hideAction: function() {
            this.visible = false;
            if (this.useDisplay === true) {
                this.setDisplayed(false)
            } else {
                this.setLeftTop( - 10000, -10000)
            }
        },
        setVisible: function(E, D, G, H, F) {
            if (E) {
                this.showAction()
            }
            if (D && E) {
                var C = function() {
                    this.sync(true);
                    if (H) {
                        H()
                    }
                }.createDelegate(this);
                A.setVisible.call(this, true, true, G, C, F)
            } else {
                if (!E) {
                    this.hideUnders(true)
                }
                var C = H;
                if (D) {
                    C = function() {
                        this.hideAction();
                        if (H) {
                            H()
                        }
                    }.createDelegate(this)
                }
                A.setVisible.call(this, E, D, G, C, F);
                if (E) {
                    this.sync(true)
                } else {
                    if (!D) {
                        this.hideAction()
                    }
                }
            }
        },
        storeXY: function(C) {
            delete this.lastLT;
            this.lastXY = C
        },
        storeLeftTop: function(D, C) {
            delete this.lastXY;
            this.lastLT = [D, C]
        },
        beforeFx: function() {
            this.beforeAction();
            return Ext.Layer.superclass.beforeFx.apply(this, arguments)
        },
        afterFx: function() {
            Ext.Layer.superclass.afterFx.apply(this, arguments);
            this.sync(this.isVisible())
        },
        beforeAction: function() {
            if (!this.updating && this.shadow) {
                this.shadow.hide()
            }
        },
        setLeft: function(C) {
            this.storeLeftTop(C, this.getTop(true));
            A.setLeft.apply(this, arguments);
            this.sync()
        },
        setTop: function(C) {
            this.storeLeftTop(this.getLeft(true), C);
            A.setTop.apply(this, arguments);
            this.sync()
        },
        setLeftTop: function(D, C) {
            this.storeLeftTop(D, C);
            A.setLeftTop.apply(this, arguments);
            this.sync()
        },
        setXY: function(F, D, G, H, E) {
            this.fixDisplay();
            this.beforeAction();
            this.storeXY(F);
            var C = this.createCB(H);
            A.setXY.call(this, F, D, G, C, E);
            if (!D) {
                C()
            }
        },
        createCB: function(D) {
            var C = this;
            return function() {
                C.constrainXY();
                C.sync(true);
                if (D) {
                    D()
                }
            }
        },
        setX: function(C, D, F, G, E) {
            this.setXY([C, this.getY()], D, F, G, E)
        },
        setY: function(G, C, E, F, D) {
            this.setXY([this.getX(), G], C, E, F, D)
        },
        setSize: function(E, F, D, H, I, G) {
            this.beforeAction();
            var C = this.createCB(I);
            A.setSize.call(this, E, F, D, H, C, G);
            if (!D) {
                C()
            }
        },
        setWidth: function(E, D, G, H, F) {
            this.beforeAction();
            var C = this.createCB(H);
            A.setWidth.call(this, E, D, G, C, F);
            if (!D) {
                C()
            }
        },
        setHeight: function(E, D, G, H, F) {
            this.beforeAction();
            var C = this.createCB(H);
            A.setHeight.call(this, E, D, G, C, F);
            if (!D) {
                C()
            }
        },
        setBounds: function(J, H, K, D, I, F, G, E) {
            this.beforeAction();
            var C = this.createCB(G);
            if (!I) {
                this.storeXY([J, H]);
                A.setXY.call(this, [J, H]);
                A.setSize.call(this, K, D, I, F, C, E);
                C()
            } else {
                A.setBounds.call(this, J, H, K, D, I, F, C, E)
            }
            return this
        },
        setZIndex: function(C) {
            this.zindex = C;
            this.setStyle("z-index", C + 2);
            if (this.shadow) {
                this.shadow.setZIndex(C + 1)
            }
            if (this.shim) {
                this.shim.setStyle("z-index", C)
            }
        }
    })
})();
Ext.Shadow = function(C) {
    Ext.apply(this, C);
    if (typeof this.mode != "string") {
        this.mode = this.defaultMode
    }
    var D = this.offset,
    B = {
        h: 0
    };
    var A = Math.floor(this.offset / 2);
    switch (this.mode.toLowerCase()) {
    case "drop":
        B.w = 0;
        B.l = B.t = D;
        B.t -= 1;
        if (Ext.isIE) {
            B.l -= this.offset + A;
            B.t -= this.offset + A;
            B.w -= A;
            B.h -= A;
            B.t += 1
        }
        break;
    case "sides":
        B.w = (D * 2);
        B.l = -D;
        B.t = D - 1;
        if (Ext.isIE) {
            B.l -= (this.offset - A);
            B.t -= this.offset + A;
            B.l += 1;
            B.w -= (this.offset - A) * 2;
            B.w -= A + 1;
            B.h -= 1
        }
        break;
    case "frame":
        B.w = B.h = (D * 2);
        B.l = B.t = -D;
        B.t += 1;
        B.h -= 2;
        if (Ext.isIE) {
            B.l -= (this.offset - A);
            B.t -= (this.offset - A);
            B.l += 1;
            B.w -= (this.offset + A + 1);
            B.h -= (this.offset + A);
            B.h += 1
        }
        break
    }
    this.adjusts = B
};
Ext.Shadow.prototype = {
    offset: 4,
    defaultMode: "drop",
    show: function(A) {
        A = Ext.get(A);
        if (!this.el) {
            this.el = Ext.Shadow.Pool.pull();
            if (this.el.dom.nextSibling != A.dom) {
                this.el.insertBefore(A)
            }
        }
        this.el.setStyle("z-index", this.zIndex || parseInt(A.getStyle("z-index"), 10) - 1);
        if (Ext.isIE) {
            this.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (this.offset) + ")"
        }
        this.realign(A.getLeft(true), A.getTop(true), A.getWidth(), A.getHeight());
        this.el.dom.style.display = "block"
    },
    isVisible: function() {
        return this.el ? true: false
    },
    realign: function(A, M, L, D) {
        if (!this.el) {
            return
        }
        var I = this.adjusts,
        G = this.el.dom,
        N = G.style;
        var E = 0;
        N.left = (A + I.l) + "px";
        N.top = (M + I.t) + "px";
        var K = (L + I.w),
        C = (D + I.h),
        F = K + "px",
        J = C + "px";
        if (N.width != F || N.height != J) {
            N.width = F;
            N.height = J;
            if (!Ext.isIE) {
                var H = G.childNodes;
                var B = Math.max(0, (K - 12)) + "px";
                H[0].childNodes[1].style.width = B;
                H[1].childNodes[1].style.width = B;
                H[2].childNodes[1].style.width = B;
                H[1].style.height = Math.max(0, (C - 12)) + "px"
            }
        }
    },
    hide: function() {
        if (this.el) {
            this.el.dom.style.display = "none";
            Ext.Shadow.Pool.push(this.el);
            delete this.el
        }
    },
    setZIndex: function(A) {
        this.zIndex = A;
        if (this.el) {
            this.el.setStyle("z-index", A)
        }
    }
};
Ext.Shadow.Pool = function() {
    var B = [];
    var A = Ext.isIE ? "<div class=\"x-ie-shadow\"></div>": "<div class=\"x-shadow\"><div class=\"xst\"><div class=\"xstl\"></div><div class=\"xstc\"></div><div class=\"xstr\"></div></div><div class=\"xsc\"><div class=\"xsml\"></div><div class=\"xsmc\"></div><div class=\"xsmr\"></div></div><div class=\"xsb\"><div class=\"xsbl\"></div><div class=\"xsbc\"></div><div class=\"xsbr\"></div></div></div>";
    return {
        pull: function() {
            var C = B.shift();
            if (!C) {
                C = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, A));
                C.autoBoxAdjust = false
            }
            return C
        },
        push: function(C) {
            B.push(C)
        }
    }
} ();
Ext.BoxComponent = Ext.extend(Ext.Component, {
    initComponent: function() {
        Ext.BoxComponent.superclass.initComponent.call(this);
        this.addEvents("resize", "move")
    },
    boxReady: false,
    deferHeight: false,
    setSize: function(B, D) {
        if (typeof B == "object") {
            D = B.height;
            B = B.width
        }
        if (!this.boxReady) {
            this.width = B;
            this.height = D;
            return this
        }
        if (this.lastSize && this.lastSize.width == B && this.lastSize.height == D) {
            return this
        }
        this.lastSize = {
            width: B,
            height: D
        };
        var C = this.adjustSize(B, D);
        var F = C.width,
        A = C.height;
        if (F !== undefined || A !== undefined) {
            var E = this.getResizeEl();
            if (!this.deferHeight && F !== undefined && A !== undefined) {
                E.setSize(F, A)
            } else {
                if (!this.deferHeight && A !== undefined) {
                    E.setHeight(A)
                } else {
                    if (F !== undefined) {
                        E.setWidth(F)
                    }
                }
            }
            this.onResize(F, A, B, D);
            this.fireEvent("resize", this, F, A, B, D)
        }
        return this
    },
    setWidth: function(A) {
        return this.setSize(A)
    },
    setHeight: function(A) {
        return this.setSize(undefined, A)
    },
    getSize: function() {
        return this.el.getSize()
    },
    getPosition: function(A) {
        if (A === true) {
            return [this.el.getLeft(true), this.el.getTop(true)]
        }
        return this.xy || this.el.getXY()
    },
    getBox: function(A) {
        var B = this.el.getSize();
        if (A === true) {
            B.x = this.el.getLeft(true);
            B.y = this.el.getTop(true)
        } else {
            var C = this.xy || this.el.getXY();
            B.x = C[0];
            B.y = C[1]
        }
        return B
    },
    updateBox: function(A) {
        this.setSize(A.width, A.height);
        this.setPagePosition(A.x, A.y);
        return this
    },
    getResizeEl: function() {
        return this.resizeEl || this.el
    },
    getPositionEl: function() {
        return this.positionEl || this.el
    },
    setPosition: function(A, F) {
        if (A && typeof A[1] == "number") {
            F = A[1];
            A = A[0]
        }
        this.x = A;
        this.y = F;
        if (!this.boxReady) {
            return this
        }
        var B = this.adjustPosition(A, F);
        var E = B.x,
        D = B.y;
        var C = this.getPositionEl();
        if (E !== undefined || D !== undefined) {
            if (E !== undefined && D !== undefined) {
                C.setLeftTop(E, D)
            } else {
                if (E !== undefined) {
                    C.setLeft(E)
                } else {
                    if (D !== undefined) {
                        C.setTop(D)
                    }
                }
            }
            this.onPosition(E, D);
            this.fireEvent("move", this, E, D)
        }
        return this
    },
    setPagePosition: function(A, C) {
        if (A && typeof A[1] == "number") {
            C = A[1];
            A = A[0]
        }
        this.pageX = A;
        this.pageY = C;
        if (!this.boxReady) {
            return
        }
        if (A === undefined || C === undefined) {
            return
        }
        var B = this.el.translatePoints(A, C);
        this.setPosition(B.left, B.top);
        return this
    },
    onRender: function(B, A) {
        Ext.BoxComponent.superclass.onRender.call(this, B, A);
        if (this.resizeEl) {
            this.resizeEl = Ext.get(this.resizeEl)
        }
        if (this.positionEl) {
            this.positionEl = Ext.get(this.positionEl)
        }
    },
    afterRender: function() {
        Ext.BoxComponent.superclass.afterRender.call(this);
        this.boxReady = true;
        this.setSize(this.width, this.height);
        if (this.x || this.y) {
            this.setPosition(this.x, this.y)
        } else {
            if (this.pageX || this.pageY) {
                this.setPagePosition(this.pageX, this.pageY)
            }
        }
    },
    syncSize: function() {
        delete this.lastSize;
        this.setSize(this.autoWidth ? undefined: this.el.getWidth(), this.autoHeight ? undefined: this.el.getHeight());
        return this
    },
    onResize: function(D, B, A, C) {},
    onPosition: function(A, B) {},
    adjustSize: function(A, B) {
        if (this.autoWidth) {
            A = "auto"
        }
        if (this.autoHeight) {
            B = "auto"
        }
        return {
            width: A,
            height: B
        }
    },
    adjustPosition: function(A, B) {
        return {
            x: A,
            y: B
        }
    }
});
Ext.reg("box", Ext.BoxComponent);
Ext.SplitBar = function(C, E, B, D, A) {
    this.el = Ext.get(C, true);
    this.el.dom.unselectable = "on";
    this.resizingEl = Ext.get(E, true);
    this.orientation = B || Ext.SplitBar.HORIZONTAL;
    this.minSize = 0;
    this.maxSize = 2000;
    this.animate = false;
    this.useShim = false;
    this.shim = null;
    if (!A) {
        this.proxy = Ext.SplitBar.createProxy(this.orientation)
    } else {
        this.proxy = Ext.get(A).dom
    }
    this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {
        dragElId: this.proxy.id
    });
    this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
    this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
    this.dragSpecs = {};
    this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
    this.adapter.init(this);
    if (this.orientation == Ext.SplitBar.HORIZONTAL) {
        this.placement = D || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT: Ext.SplitBar.RIGHT);
        this.el.addClass("x-splitbar-h")
    } else {
        this.placement = D || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP: Ext.SplitBar.BOTTOM);
        this.el.addClass("x-splitbar-v")
    }
    this.addEvents("resize", "moved", "beforeresize", "beforeapply");
    Ext.SplitBar.superclass.constructor.call(this)
};
Ext.extend(Ext.SplitBar, Ext.util.Observable, {
    onStartProxyDrag: function(A, E) {
        this.fireEvent("beforeresize", this);
        this.overlay = Ext.DomHelper.append(document.body, {
            cls: "x-drag-overlay",
            html: "&#160;"
        },
        true);
        this.overlay.unselectable();
        this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
        this.overlay.show();
        Ext.get(this.proxy).setDisplayed("block");
        var C = this.adapter.getElementSize(this);
        this.activeMinSize = this.getMinimumSize();
        this.activeMaxSize = this.getMaximumSize();
        var D = C - this.activeMinSize;
        var B = Math.max(this.activeMaxSize - C, 0);
        if (this.orientation == Ext.SplitBar.HORIZONTAL) {
            this.dd.resetConstraints();
            this.dd.setXConstraint(this.placement == Ext.SplitBar.LEFT ? D: B, this.placement == Ext.SplitBar.LEFT ? B: D);
            this.dd.setYConstraint(0, 0)
        } else {
            this.dd.resetConstraints();
            this.dd.setXConstraint(0, 0);
            this.dd.setYConstraint(this.placement == Ext.SplitBar.TOP ? D: B, this.placement == Ext.SplitBar.TOP ? B: D)
        }
        this.dragSpecs.startSize = C;
        this.dragSpecs.startPoint = [A, E];
        Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, A, E)
    },
    onEndProxyDrag: function(C) {
        Ext.get(this.proxy).setDisplayed(false);
        var B = Ext.lib.Event.getXY(C);
        if (this.overlay) {
            this.overlay.remove();
            delete this.overlay
        }
        var A;
        if (this.orientation == Ext.SplitBar.HORIZONTAL) {
            A = this.dragSpecs.startSize + (this.placement == Ext.SplitBar.LEFT ? B[0] - this.dragSpecs.startPoint[0] : this.dragSpecs.startPoint[0] - B[0])
        } else {
            A = this.dragSpecs.startSize + (this.placement == Ext.SplitBar.TOP ? B[1] - this.dragSpecs.startPoint[1] : this.dragSpecs.startPoint[1] - B[1])
        }
        A = Math.min(Math.max(A, this.activeMinSize), this.activeMaxSize);
        if (A != this.dragSpecs.startSize) {
            if (this.fireEvent("beforeapply", this, A) !== false) {
                this.adapter.setElementSize(this, A);
                this.fireEvent("moved", this, A);
                this.fireEvent("resize", this, A)
            }
        }
    },
    getAdapter: function() {
        return this.adapter
    },
    setAdapter: function(A) {
        this.adapter = A;
        this.adapter.init(this)
    },
    getMinimumSize: function() {
        return this.minSize
    },
    setMinimumSize: function(A) {
        this.minSize = A
    },
    getMaximumSize: function() {
        return this.maxSize
    },
    setMaximumSize: function(A) {
        this.maxSize = A
    },
    setCurrentSize: function(B) {
        var A = this.animate;
        this.animate = false;
        this.adapter.setElementSize(this, B);
        this.animate = A
    },
    destroy: function(A) {
        if (this.shim) {
            this.shim.remove()
        }
        this.dd.unreg();
        Ext.removeNode(this.proxy);
        if (A) {
            this.el.remove()
        }
    }
});
Ext.SplitBar.createProxy = function(B) {
    var C = new Ext.Element(document.createElement("div"));
    C.unselectable();
    var A = "x-splitbar-proxy";
    C.addClass(A + " " + (B == Ext.SplitBar.HORIZONTAL ? A + "-h": A + "-v"));
    document.body.appendChild(C.dom);
    return C.dom
};
Ext.SplitBar.BasicLayoutAdapter = function() {};
Ext.SplitBar.BasicLayoutAdapter.prototype = {
    init: function(A) {},
    getElementSize: function(A) {
        if (A.orientation == Ext.SplitBar.HORIZONTAL) {
            return A.resizingEl.getWidth()
        } else {
            return A.resizingEl.getHeight()
        }
    },
    setElementSize: function(B, A, C) {
        if (B.orientation == Ext.SplitBar.HORIZONTAL) {
            if (!B.animate) {
                B.resizingEl.setWidth(A);
                if (C) {
                    C(B, A)
                }
            } else {
                B.resizingEl.setWidth(A, true, 0.1, C, "easeOut")
            }
        } else {
            if (!B.animate) {
                B.resizingEl.setHeight(A);
                if (C) {
                    C(B, A)
                }
            } else {
                B.resizingEl.setHeight(A, true, 0.1, C, "easeOut")
            }
        }
    }
};
Ext.SplitBar.AbsoluteLayoutAdapter = function(A) {
    this.basic = new Ext.SplitBar.BasicLayoutAdapter();
    this.container = Ext.get(A)
};
Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
    init: function(A) {
        this.basic.init(A)
    },
    getElementSize: function(A) {
        return this.basic.getElementSize(A)
    },
    setElementSize: function(B, A, C) {
        this.basic.setElementSize(B, A, this.moveSplitter.createDelegate(this, [B]))
    },
    moveSplitter: function(A) {
        var B = Ext.SplitBar;
        switch (A.placement) {
        case B.LEFT:
            A.el.setX(A.resizingEl.getRight());
            break;
        case B.RIGHT:
            A.el.setStyle("right", (this.container.getWidth() - A.resizingEl.getLeft()) + "px");
            break;
        case B.TOP:
            A.el.setY(A.resizingEl.getBottom());
            break;
        case B.BOTTOM:
            A.el.setY(A.resizingEl.getTop() - A.el.getHeight());
            break
        }
    }
};
Ext.SplitBar.VERTICAL = 1;
Ext.SplitBar.HORIZONTAL = 2;
Ext.SplitBar.LEFT = 1;
Ext.SplitBar.RIGHT = 2;
Ext.SplitBar.TOP = 3;
Ext.SplitBar.BOTTOM = 4;
Ext.Container = Ext.extend(Ext.BoxComponent, {
    autoDestroy: true,
    defaultType: "panel",
    initComponent: function() {
        Ext.Container.superclass.initComponent.call(this);
        this.addEvents("afterlayout", "beforeadd", "beforeremove", "add", "remove");
        var A = this.items;
        if (A) {
            delete this.items;
            if (Ext.isArray(A)) {
                this.add.apply(this, A)
            } else {
                this.add(A)
            }
        }
    },
    initItems: function() {
        if (!this.items) {
            this.items = new Ext.util.MixedCollection(false, this.getComponentId);
            this.getLayout()
        }
    },
    setLayout: function(A) {
        if (this.layout && this.layout != A) {
            this.layout.setContainer(null)
        }
        this.initItems();
        this.layout = A;
        A.setContainer(this)
    },
    render: function() {
        Ext.Container.superclass.render.apply(this, arguments);
        if (this.layout) {
            if (typeof this.layout == "string") {
                this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)
            }
            this.setLayout(this.layout);
            if (this.activeItem !== undefined) {
                var A = this.activeItem;
                delete this.activeItem;
                this.layout.setActiveItem(A);
                return
            }
        }
        if (!this.ownerCt) {
            this.doLayout()
        }
        if (this.monitorResize === true) {
            Ext.EventManager.onWindowResize(this.doLayout, this, [false])
        }
    },
    getLayoutTarget: function() {
        return this.el
    },
    getComponentId: function(A) {
        return A.itemId || A.id
    },
    add: function(C) {
        if (!this.items) {
            this.initItems()
        }
        var B = arguments,
        A = B.length;
        if (A > 1) {
            for (var D = 0; D < A; D++) {
                this.add(B[D])
            }
            return
        }
        var F = this.lookupComponent(this.applyDefaults(C));
        var E = this.items.length;
        if (this.fireEvent("beforeadd", this, F, E) !== false && this.onBeforeAdd(F) !== false) {
            this.items.add(F);
            F.ownerCt = this;
            this.fireEvent("add", this, F, E)
        }
        return F
    },
    insert: function(D, C) {
        if (!this.items) {
            this.initItems()
        }
        var B = arguments,
        A = B.length;
        if (A > 2) {
            for (var E = A - 1; E >= 1; --E) {
                this.insert(D, B[E])
            }
            return
        }
        var F = this.lookupComponent(this.applyDefaults(C));
        if (F.ownerCt == this && this.items.indexOf(F) < D) {--D
        }
        if (this.fireEvent("beforeadd", this, F, D) !== false && this.onBeforeAdd(F) !== false) {
            this.items.insert(D, F);
            F.ownerCt = this;
            this.fireEvent("add", this, F, D)
        }
        return F
    },
    applyDefaults: function(A) {
        if (this.defaults) {
            if (typeof A == "string") {
                A = Ext.ComponentMgr.get(A);
                Ext.apply(A, this.defaults)
            } else {
                if (!A.events) {
                    Ext.applyIf(A, this.defaults)
                } else {
                    Ext.apply(A, this.defaults)
                }
            }
        }
        return A
    },
    onBeforeAdd: function(A) {
        if (A.ownerCt) {
            A.ownerCt.remove(A, false)
        }
        if (this.hideBorders === true) {
            A.border = (A.border === true)
        }
    },
    remove: function(A, B) {
        var C = this.getComponent(A);
        if (C && this.fireEvent("beforeremove", this, C) !== false) {
            this.items.remove(C);
            delete C.ownerCt;
            if (B === true || (B !== false && this.autoDestroy)) {
                C.destroy()
            }
            if (this.layout && this.layout.activeItem == C) {
                delete this.layout.activeItem
            }
            this.fireEvent("remove", this, C)
        }
        return C
    },
    getComponent: function(A) {
        if (typeof A == "object") {
            return A
        }
        return this.items.get(A)
    },
    lookupComponent: function(A) {
        if (typeof A == "string") {
            return Ext.ComponentMgr.get(A)
        } else {
            if (!A.events) {
                return this.createComponent(A)
            }
        }
        return A
    },
    createComponent: function(A) {
        return Ext.ComponentMgr.create(A, this.defaultType)
    },
    doLayout: function(D) {
        if (this.rendered && this.layout) {
            this.layout.layout()
        }
        if (D !== false && this.items) {
            var C = this.items.items;
            for (var B = 0, A = C.length; B < A; B++) {
                var E = C[B];
                if (E.doLayout) {
                    E.doLayout()
                }
            }
        }
    },
    getLayout: function() {
        if (!this.layout) {
            var A = new Ext.layout.ContainerLayout(this.layoutConfig);
            this.setLayout(A)
        }
        return this.layout
    },
    beforeDestroy: function() {
        if (this.items) {
            Ext.destroy.apply(Ext, this.items.items)
        }
        if (this.monitorResize) {
            Ext.EventManager.removeResizeListener(this.doLayout, this)
        }
        if (this.layout && this.layout.destroy) {
            this.layout.destroy()
        }
        Ext.Container.superclass.beforeDestroy.call(this)
    },
    bubble: function(C, B, A) {
        var D = this;
        while (D) {
            if (C.apply(B || D, A || [D]) === false) {
                break
            }
            D = D.ownerCt
        }
    },
    cascade: function(F, E, B) {
        if (F.apply(E || this, B || [this]) !== false) {
            if (this.items) {
                var D = this.items.items;
                for (var C = 0, A = D.length; C < A; C++) {
                    if (D[C].cascade) {
                        D[C].cascade(F, E, B)
                    } else {
                        F.apply(E || D[C], B || [D[C]])
                    }
                }
            }
        }
    },
    findById: function(C) {
        var A, B = this;
        this.cascade(function(D) {
            if (B != D && D.id === C) {
                A = D;
                return false
            }
        });
        return A || null
    },
    findByType: function(A) {
        return typeof A == "function" ? this.findBy(function(B) {
            return B.constructor === A
        }) : this.findBy(function(B) {
            return B.constructor.xtype === A
        })
    },
    find: function(B, A) {
        return this.findBy(function(C) {
            return C[B] === A
        })
    },
    findBy: function(D, C) {
        var A = [],
        B = this;
        this.cascade(function(E) {
            if (B != E && D.call(C || E, E, B) === true) {
                A.push(E)
            }
        });
        return A
    }
});
Ext.Container.LAYOUTS = {};
Ext.reg("container", Ext.Container);
Ext.layout.ContainerLayout = function(A) {
    Ext.apply(this, A)
};
Ext.layout.ContainerLayout.prototype = {
    monitorResize: false,
    activeItem: null,
    layout: function() {
        var A = this.container.getLayoutTarget();
        this.onLayout(this.container, A);
        this.container.fireEvent("afterlayout", this.container, this)
    },
    onLayout: function(A, B) {
        this.renderAll(A, B)
    },
    isValidParent: function(C, B) {
        var A = C.getPositionEl ? C.getPositionEl() : C.getEl();
        return A.dom.parentNode == B.dom
    },
    renderAll: function(D, E) {
        var B = D.items.items;
        for (var C = 0, A = B.length; C < A; C++) {
            var F = B[C];
            if (F && (!F.rendered || !this.isValidParent(F, E))) {
                this.renderItem(F, C, E)
            }
        }
    },
    renderItem: function(D, A, C) {
        if (D && !D.rendered) {
            D.render(C, A);
            if (this.extraCls) {
                var B = D.getPositionEl ? D.getPositionEl() : D;
                B.addClass(this.extraCls)
            }
            if (this.renderHidden && D != this.activeItem) {
                D.hide()
            }
        } else {
            if (D && !this.isValidParent(D, C)) {
                if (this.extraCls) {
                    D.addClass(this.extraCls)
                }
                if (typeof A == "number") {
                    A = C.dom.childNodes[A]
                }
                C.dom.insertBefore(D.getEl().dom, A || null);
                if (this.renderHidden && D != this.activeItem) {
                    D.hide()
                }
            }
        }
    },
    onResize: function() {
        if (this.container.collapsed) {
            return
        }
        var A = this.container.bufferResize;
        if (A) {
            if (!this.resizeTask) {
                this.resizeTask = new Ext.util.DelayedTask(this.layout, this);
                this.resizeBuffer = typeof A == "number" ? A: 100
            }
            this.resizeTask.delay(this.resizeBuffer)
        } else {
            this.layout()
        }
    },
    setContainer: function(A) {
        if (this.monitorResize && A != this.container) {
            if (this.container) {
                this.container.un("resize", this.onResize, this)
            }
            if (A) {
                A.on("resize", this.onResize, this)
            }
        }
        this.container = A
    },
    parseMargins: function(B) {
        var C = B.split(" ");
        var A = C.length;
        if (A == 1) {
            C[1] = C[0];
            C[2] = C[0];
            C[3] = C[0]
        }
        if (A == 2) {
            C[2] = C[0];
            C[3] = C[1]
        }
        return {
            top: parseInt(C[0], 10) || 0,
            right: parseInt(C[1], 10) || 0,
            bottom: parseInt(C[2], 10) || 0,
            left: parseInt(C[3], 10) || 0
        }
    },
    destroy: Ext.emptyFn
};
Ext.Container.LAYOUTS["auto"] = Ext.layout.ContainerLayout;
Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
    monitorResize: true,
    onLayout: function(A, B) {
        Ext.layout.FitLayout.superclass.onLayout.call(this, A, B);
        if (!this.container.collapsed) {
            this.setItemSize(this.activeItem || A.items.itemAt(0), B.getStyleSize())
        }
    },
    setItemSize: function(B, A) {
        if (B && A.height > 0) {
            B.setSize(A)
        }
    }
});
Ext.Container.LAYOUTS["fit"] = Ext.layout.FitLayout;
Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
    deferredRender: false,
    renderHidden: true,
    setActiveItem: function(A) {
        A = this.container.getComponent(A);
        if (this.activeItem != A) {
            if (this.activeItem) {
                this.activeItem.hide()
            }
            this.activeItem = A;
            A.show();
            this.layout()
        }
    },
    renderAll: function(A, B) {
        if (this.deferredRender) {
            this.renderItem(this.activeItem, undefined, B)
        } else {
            Ext.layout.CardLayout.superclass.renderAll.call(this, A, B)
        }
    }
});
Ext.Container.LAYOUTS["card"] = Ext.layout.CardLayout;
Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
    monitorResize: true,
    getAnchorViewSize: function(A, B) {
        return B.dom == document.body ? B.getViewSize() : B.getStyleSize()
    },
    onLayout: function(F, I) {
        Ext.layout.AnchorLayout.superclass.onLayout.call(this, F, I);
        var O = this.getAnchorViewSize(F, I);
        var M = O.width,
        E = O.height;
        if (M < 20 || E < 20) {
            return
        }
        var B, K;
        if (F.anchorSize) {
            if (typeof F.anchorSize == "number") {
                B = F.anchorSize
            } else {
                B = F.anchorSize.width;
                K = F.anchorSize.height
            }
        } else {
            B = F.initialConfig.width;
            K = F.initialConfig.height
        }
        var H = F.items.items,
        G = H.length,
        D, J, L, C, A;
        for (D = 0; D < G; D++) {
            J = H[D];
            if (J.anchor) {
                L = J.anchorSpec;
                if (!L) {
                    var N = J.anchor.split(" ");
                    J.anchorSpec = L = {
                        right: this.parseAnchor(N[0], J.initialConfig.width, B),
                        bottom: this.parseAnchor(N[1], J.initialConfig.height, K)
                    }
                }
                C = L.right ? this.adjustWidthAnchor(L.right(M), J) : undefined;
                A = L.bottom ? this.adjustHeightAnchor(L.bottom(E), J) : undefined;
                if (C || A) {
                    J.setSize(C || undefined, A || undefined)
                }
            }
        }
    },
    parseAnchor: function(B, F, A) {
        if (B && B != "none") {
            var D;
            if (/^(r|right|b|bottom)$/i.test(B)) {
                var E = A - F;
                return function(G) {
                    if (G !== D) {
                        D = G;
                        return G - E
                    }
                }
            } else {
                if (B.indexOf("%") != -1) {
                    var C = parseFloat(B.replace("%", "")) * 0.01;
                    return function(G) {
                        if (G !== D) {
                            D = G;
                            return Math.floor(G * C)
                        }
                    }
                } else {
                    B = parseInt(B, 10);
                    if (!isNaN(B)) {
                        return function(G) {
                            if (G !== D) {
                                D = G;
                                return G + B
                            }
                        }
                    }
                }
            }
        }
        return false
    },
    adjustWidthAnchor: function(B, A) {
        return B
    },
    adjustHeightAnchor: function(B, A) {
        return B
    }
});
Ext.Container.LAYOUTS["anchor"] = Ext.layout.AnchorLayout;
Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
    monitorResize: true,
    extraCls: "x-column",
    scrollOffset: 0,
    isValidParent: function(B, A) {
        return B.getEl().dom.parentNode == this.innerCt.dom
    },
    onLayout: function(C, F) {
        var D = C.items.items,
        E = D.length,
        G, A;
        if (!this.innerCt) {
            F.addClass("x-column-layout-ct");
            this.innerCt = F.createChild({
                cls: "x-column-inner"
            });
            this.innerCt.createChild({
                cls: "x-clear"
            })
        }
        this.renderAll(C, this.innerCt);
        var J = Ext.isIE && F.dom != Ext.getBody().dom ? F.getStyleSize() : F.getViewSize();
        if (J.width < 1 && J.height < 1) {
            return
        }
        var H = J.width - F.getPadding("lr") - this.scrollOffset,
        B = J.height - F.getPadding("tb"),
        I = H;
        this.innerCt.setWidth(H);
        for (A = 0; A < E; A++) {
            G = D[A];
            if (!G.columnWidth) {
                I -= (G.getSize().width + G.getEl().getMargins("lr"))
            }
        }
        I = I < 0 ? 0 : I;
        for (A = 0; A < E; A++) {
            G = D[A];
            if (G.columnWidth) {
                G.setSize(Math.floor(G.columnWidth * I) - G.getEl().getMargins("lr"))
            }
        }
    }
});
Ext.Container.LAYOUTS["column"] = Ext.layout.ColumnLayout;
Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
    monitorResize: true,
    rendered: false,
    onLayout: function(B, X) {
        var C;
        if (!this.rendered) {
            X.position();
            X.addClass("x-border-layout-ct");
            var M = B.items.items;
            C = [];
            for (var Q = 0, R = M.length; Q < R; Q++) {
                var U = M[Q];
                var F = U.region;
                if (U.collapsed) {
                    C.push(U)
                }
                U.collapsed = false;
                if (!U.rendered) {
                    U.cls = U.cls ? U.cls + " x-border-panel": "x-border-panel";
                    U.render(X, Q)
                }
                this[F] = F != "center" && U.split ? new Ext.layout.BorderLayout.SplitRegion(this, U.initialConfig, F) : new Ext.layout.BorderLayout.Region(this, U.initialConfig, F);
                this[F].render(X, U)
            }
            this.rendered = true
        }
        var L = X.getViewSize();
        if (L.width < 20 || L.height < 20) {
            if (C) {
                this.restoreCollapsed = C
            }
            return
        } else {
            if (this.restoreCollapsed) {
                C = this.restoreCollapsed;
                delete this.restoreCollapsed
            }
        }
        var J = L.width,
        S = L.height;
        var I = J,
        P = S,
        G = 0,
        H = 0;
        var N = this.north,
        K = this.south,
        E = this.west,
        T = this.east,
        U = this.center;
        if (!U) {
            throw "No center region defined in BorderLayout " + B.id
        }
        if (N && N.isVisible()) {
            var W = N.getSize();
            var O = N.getMargins();
            W.width = J - (O.left + O.right);
            W.x = O.left;
            W.y = O.top;
            G = W.height + W.y + O.bottom;
            P -= G;
            N.applyLayout(W)
        }
        if (K && K.isVisible()) {
            var W = K.getSize();
            var O = K.getMargins();
            W.width = J - (O.left + O.right);
            W.x = O.left;
            var V = (W.height + O.top + O.bottom);
            W.y = S - V + O.top;
            P -= V;
            K.applyLayout(W)
        }
        if (E && E.isVisible()) {
            var W = E.getSize();
            var O = E.getMargins();
            W.height = P - (O.top + O.bottom);
            W.x = O.left;
            W.y = G + O.top;
            var A = (W.width + O.left + O.right);
            H += A;
            I -= A;
            E.applyLayout(W)
        }
        if (T && T.isVisible()) {
            var W = T.getSize();
            var O = T.getMargins();
            W.height = P - (O.top + O.bottom);
            var A = (W.width + O.left + O.right);
            W.x = J - A + O.left;
            W.y = G + O.top;
            I -= A;
            T.applyLayout(W)
        }
        var O = U.getMargins();
        var D = {
            x: H + O.left,
            y: G + O.top,
            width: I - (O.left + O.right),
            height: P - (O.top + O.bottom)
        };
        U.applyLayout(D);
        if (C) {
            for (var Q = 0, R = C.length; Q < R; Q++) {
                C[Q].collapse(false)
            }
        }
        if (Ext.isIE && Ext.isStrict) {
            X.repaint()
        }
    },
    destroy: function() {
        var B = ["north", "south", "east", "west"];
        for (var A = 0; A < B.length; A++) {
            var C = this[B[A]];
            if (C && C.split) {
                C.split.destroy(true)
            }
        }
        Ext.layout.BorderLayout.superclass.destroy.call(this)
    }
});
Ext.layout.BorderLayout.Region = function(B, A, C) {
    Ext.apply(this, A);
    this.layout = B;
    this.position = C;
    this.state = {};
    if (typeof this.margins == "string") {
        this.margins = this.layout.parseMargins(this.margins)
    }
    this.margins = Ext.applyIf(this.margins || {},
    this.defaultMargins);
    if (this.collapsible) {
        if (typeof this.cmargins == "string") {
            this.cmargins = this.layout.parseMargins(this.cmargins)
        }
        if (this.collapseMode == "mini" && !this.cmargins) {
            this.cmargins = {
                left: 0,
                top: 0,
                right: 0,
                bottom: 0
            }
        } else {
            this.cmargins = Ext.applyIf(this.cmargins || {},
            C == "north" || C == "south" ? this.defaultNSCMargins: this.defaultEWCMargins)
        }
    }
};
Ext.layout.BorderLayout.Region.prototype = {
    collapsible: false,
    split: false,
    floatable: true,
    minWidth: 50,
    minHeight: 50,
    defaultMargins: {
        left: 0,
        top: 0,
        right: 0,
        bottom: 0
    },
    defaultNSCMargins: {
        left: 5,
        top: 5,
        right: 5,
        bottom: 5
    },
    defaultEWCMargins: {
        left: 5,
        top: 0,
        right: 5,
        bottom: 0
    },
    isCollapsed: false,
    render: function(B, C) {
        this.panel = C;
        C.el.enableDisplayMode();
        this.targetEl = B;
        this.el = C.el;
        var A = C.getState,
        D = this.position;
        C.getState = function() {
            return Ext.apply(A.call(C) || {},
            this.state)
        }.createDelegate(this);
        if (D != "center") {
            C.allowQueuedExpand = false;
            C.on({
                beforecollapse: this.beforeCollapse,
                collapse: this.onCollapse,
                beforeexpand: this.beforeExpand,
                expand: this.onExpand,
                hide: this.onHide,
                show: this.onShow,
                scope: this
            });
            if (this.collapsible) {
                C.collapseEl = "el";
                C.slideAnchor = this.getSlideAnchor()
            }
            if (C.tools && C.tools.toggle) {
                C.tools.toggle.addClass("x-tool-collapse-" + D);
                C.tools.toggle.addClassOnOver("x-tool-collapse-" + D + "-over")
            }
        }
    },
    getCollapsedEl: function() {
        if (!this.collapsedEl) {
            if (!this.toolTemplate) {
                var B = new Ext.Template("<div class=\"x-tool x-tool-{id}\">&#160;</div>");
                B.disableFormats = true;
                B.compile();
                Ext.layout.BorderLayout.Region.prototype.toolTemplate = B
            }
            this.collapsedEl = this.targetEl.createChild({
                cls: "x-layout-collapsed x-layout-collapsed-" + this.position,
                id: this.panel.id + "-xcollapsed"
            });
            this.collapsedEl.enableDisplayMode("block");
            if (this.collapseMode == "mini") {
                this.collapsedEl.addClass("x-layout-cmini-" + this.position);
                this.miniCollapsedEl = this.collapsedEl.createChild({
                    cls: "x-layout-mini x-layout-mini-" + this.position,
                    html: "&#160;"
                });
                this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");
                this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
                this.collapsedEl.on("click", this.onExpandClick, this, {
                    stopEvent: true
                })
            } else {
                var A = this.toolTemplate.append(this.collapsedEl.dom, {
                    id: "expand-" + this.position
                },
                true);
                A.addClassOnOver("x-tool-expand-" + this.position + "-over");
                A.on("click", this.onExpandClick, this, {
                    stopEvent: true
                });
                if (this.floatable !== false) {
                    this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
                    this.collapsedEl.on("click", this.collapseClick, this)
                }
            }
        }
        return this.collapsedEl
    },
    onExpandClick: function(A) {
        if (this.isSlid) {
            this.afterSlideIn();
            this.panel.expand(false)
        } else {
            this.panel.expand()
        }
    },
    onCollapseClick: function(A) {
        this.panel.collapse()
    },
    beforeCollapse: function(B, A) {
        this.lastAnim = A;
        if (this.splitEl) {
            this.splitEl.hide()
        }
        this.getCollapsedEl().show();
        this.panel.el.setStyle("z-index", 100);
        this.isCollapsed = true;
        this.layout.layout()
    },
    onCollapse: function(A) {
        this.panel.el.setStyle("z-index", 1);
        if (this.lastAnim === false || this.panel.animCollapse === false) {
            this.getCollapsedEl().dom.style.visibility = "visible"
        } else {
            this.getCollapsedEl().slideIn(this.panel.slideAnchor, {
                duration: 0.2
            })
        }
        this.state.collapsed = true;
        this.panel.saveState()
    },
    beforeExpand: function(A) {
        var B = this.getCollapsedEl();
        this.el.show();
        if (this.position == "east" || this.position == "west") {
            this.panel.setSize(undefined, B.getHeight())
        } else {
            this.panel.setSize(B.getWidth(), undefined)
        }
        B.hide();
        B.dom.style.visibility = "hidden";
        this.panel.el.setStyle("z-index", 100)
    },
    onExpand: function() {
        this.isCollapsed = false;
        if (this.splitEl) {
            this.splitEl.show()
        }
        this.layout.layout();
        this.panel.el.setStyle("z-index", 1);
        this.state.collapsed = false;
        this.panel.saveState()
    },
    collapseClick: function(A) {
        if (this.isSlid) {
            A.stopPropagation();
            this.slideIn()
        } else {
            A.stopPropagation();
            this.slideOut()
        }
    },
    onHide: function() {
        if (this.isCollapsed) {
            this.getCollapsedEl().hide()
        } else {
            if (this.splitEl) {
                this.splitEl.hide()
            }
        }
    },
    onShow: function() {
        if (this.isCollapsed) {
            this.getCollapsedEl().show()
        } else {
            if (this.splitEl) {
                this.splitEl.show()
            }
        }
    },
    isVisible: function() {
        return ! this.panel.hidden
    },
    getMargins: function() {
        return this.isCollapsed && this.cmargins ? this.cmargins: this.margins
    },
    getSize: function() {
        return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize()
    },
    setPanel: function(A) {
        this.panel = A
    },
    getMinWidth: function() {
        return this.minWidth
    },
    getMinHeight: function() {
        return this.minHeight
    },
    applyLayoutCollapsed: function(A) {
        var B = this.getCollapsedEl();
        B.setLeftTop(A.x, A.y);
        B.setSize(A.width, A.height)
    },
    applyLayout: function(A) {
        if (this.isCollapsed) {
            this.applyLayoutCollapsed(A)
        } else {
            this.panel.setPosition(A.x, A.y);
            this.panel.setSize(A.width, A.height)
        }
    },
    beforeSlide: function() {
        this.panel.beforeEffect()
    },
    afterSlide: function() {
        this.panel.afterEffect()
    },
    initAutoHide: function() {
        if (this.autoHide !== false) {
            if (!this.autoHideHd) {
                var A = new Ext.util.DelayedTask(this.slideIn, this);
                this.autoHideHd = {
                    "mouseout": function(B) {
                        if (!B.within(this.el, true)) {
                            A.delay(500)
                        }
                    },
                    "mouseover": function(B) {
                        A.cancel()
                    },
                    scope: this
                }
            }
            this.el.on(this.autoHideHd)
        }
    },
    clearAutoHide: function() {
        if (this.autoHide !== false) {
            this.el.un("mouseout", this.autoHideHd.mouseout);
            this.el.un("mouseover", this.autoHideHd.mouseover)
        }
    },
    clearMonitor: function() {
        Ext.getDoc().un("click", this.slideInIf, this)
    },
    slideOut: function() {
        if (this.isSlid || this.el.hasActiveFx()) {
            return
        }
        this.isSlid = true;
        var A = this.panel.tools;
        if (A && A.toggle) {
            A.toggle.hide()
        }
        this.el.show();
        if (this.position == "east" || this.position == "west") {
            this.panel.setSize(undefined, this.collapsedEl.getHeight())
        } else {
            this.panel.setSize(this.collapsedEl.getWidth(), undefined)
        }
        this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];
        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
        this.el.setStyle("z-index", 102);
        if (this.animFloat !== false) {
            this.beforeSlide();
            this.el.slideIn(this.getSlideAnchor(), {
                callback: function() {
                    this.afterSlide();
                    this.initAutoHide();
                    Ext.getDoc().on("click", this.slideInIf, this)
                },
                scope: this,
                block: true
            })
        } else {
            this.initAutoHide();
            Ext.getDoc().on("click", this.slideInIf, this)
        }
    },
    afterSlideIn: function() {
        this.clearAutoHide();
        this.isSlid = false;
        this.clearMonitor();
        this.el.setStyle("z-index", "");
        this.el.dom.style.left = this.restoreLT[0];
        this.el.dom.style.top = this.restoreLT[1];
        var A = this.panel.tools;
        if (A && A.toggle) {
            A.toggle.show()
        }
    },
    slideIn: function(A) {
        if (!this.isSlid || this.el.hasActiveFx()) {
            Ext.callback(A);
            return
        }
        this.isSlid = false;
        if (this.animFloat !== false) {
            this.beforeSlide();
            this.el.slideOut(this.getSlideAnchor(), {
                callback: function() {
                    this.el.hide();
                    this.afterSlide();
                    this.afterSlideIn();
                    Ext.callback(A)
                },
                scope: this,
                block: true
            })
        } else {
            this.el.hide();
            this.afterSlideIn()
        }
    },
    slideInIf: function(A) {
        if (!A.within(this.el)) {
            this.slideIn()
        }
    },
    anchors: {
        "west": "left",
        "east": "right",
        "north": "top",
        "south": "bottom"
    },
    sanchors: {
        "west": "l",
        "east": "r",
        "north": "t",
        "south": "b"
    },
    canchors: {
        "west": "tl-tr",
        "east": "tr-tl",
        "north": "tl-bl",
        "south": "bl-tl"
    },
    getAnchor: function() {
        return this.anchors[this.position]
    },
    getCollapseAnchor: function() {
        return this.canchors[this.position]
    },
    getSlideAnchor: function() {
        return this.sanchors[this.position]
    },
    getAlignAdj: function() {
        var A = this.cmargins;
        switch (this.position) {
        case "west":
            return [0, 0];
            break;
        case "east":
            return [0, 0];
            break;
        case "north":
            return [0, 0];
            break;
        case "south":
            return [0, 0];
            break
        }
    },
    getExpandAdj: function() {
        var B = this.collapsedEl,
        A = this.cmargins;
        switch (this.position) {
        case "west":
            return [ - (A.right + B.getWidth() + A.left), 0];
            break;
        case "east":
            return [A.right + B.getWidth() + A.left, 0];
            break;
        case "north":
            return [0, -(A.top + A.bottom + B.getHeight())];
            break;
        case "south":
            return [0, A.top + A.bottom + B.getHeight()];
            break
        }
    }
};
Ext.layout.BorderLayout.SplitRegion = function(B, A, C) {
    Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, B, A, C);
    this.applyLayout = this.applyFns[C]
};
Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
    splitTip: "Drag to resize.",
    collapsibleSplitTip: "Drag to resize. Double click to hide.",
    useSplitTips: false,
    splitSettings: {
        north: {
            orientation: Ext.SplitBar.VERTICAL,
            placement: Ext.SplitBar.TOP,
            maxFn: "getVMaxSize",
            minProp: "minHeight",
            maxProp: "maxHeight"
        },
        south: {
            orientation: Ext.SplitBar.VERTICAL,
            placement: Ext.SplitBar.BOTTOM,
            maxFn: "getVMaxSize",
            minProp: "minHeight",
            maxProp: "maxHeight"
        },
        east: {
            orientation: Ext.SplitBar.HORIZONTAL,
            placement: Ext.SplitBar.RIGHT,
            maxFn: "getHMaxSize",
            minProp: "minWidth",
            maxProp: "maxWidth"
        },
        west: {
            orientation: Ext.SplitBar.HORIZONTAL,
            placement: Ext.SplitBar.LEFT,
            maxFn: "getHMaxSize",
            minProp: "minWidth",
            maxProp: "maxWidth"
        }
    },
    applyFns: {
        west: function(C) {
            if (this.isCollapsed) {
                return this.applyLayoutCollapsed(C)
            }
            var D = this.splitEl.dom,
            B = D.style;
            this.panel.setPosition(C.x, C.y);
            var A = D.offsetWidth;
            B.left = (C.x + C.width - A) + "px";
            B.top = (C.y) + "px";
            B.height = Math.max(0, C.height) + "px";
            this.panel.setSize(C.width - A, C.height)
        },
        east: function(C) {
            if (this.isCollapsed) {
                return this.applyLayoutCollapsed(C)
            }
            var D = this.splitEl.dom,
            B = D.style;
            var A = D.offsetWidth;
            this.panel.setPosition(C.x + A, C.y);
            B.left = (C.x) + "px";
            B.top = (C.y) + "px";
            B.height = Math.max(0, C.height) + "px";
            this.panel.setSize(C.width - A, C.height)
        },
        north: function(C) {
            if (this.isCollapsed) {
                return this.applyLayoutCollapsed(C)
            }
            var D = this.splitEl.dom,
            B = D.style;
            var A = D.offsetHeight;
            this.panel.setPosition(C.x, C.y);
            B.left = (C.x) + "px";
            B.top = (C.y + C.height - A) + "px";
            B.width = Math.max(0, C.width) + "px";
            this.panel.setSize(C.width, C.height - A)
        },
        south: function(C) {
            if (this.isCollapsed) {
                return this.applyLayoutCollapsed(C)
            }
            var D = this.splitEl.dom,
            B = D.style;
            var A = D.offsetHeight;
            this.panel.setPosition(C.x, C.y + A);
            B.left = (C.x) + "px";
            B.top = (C.y) + "px";
            B.width = Math.max(0, C.width) + "px";
            this.panel.setSize(C.width, C.height - A)
        }
    },
    render: function(A, C) {
        Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, A, C);
        var D = this.position;
        this.splitEl = A.createChild({
            cls: "x-layout-split x-layout-split-" + D,
            html: "&#160;",
            id: this.panel.id + "-xsplit"
        });
        if (this.collapseMode == "mini") {
            this.miniSplitEl = this.splitEl.createChild({
                cls: "x-layout-mini x-layout-mini-" + D,
                html: "&#160;"
            });
            this.miniSplitEl.addClassOnOver("x-layout-mini-over");
            this.miniSplitEl.on("click", this.onCollapseClick, this, {
                stopEvent: true
            })
        }
        var B = this.splitSettings[D];
        this.split = new Ext.SplitBar(this.splitEl.dom, C.el, B.orientation);
        this.split.placement = B.placement;
        this.split.getMaximumSize = this[B.maxFn].createDelegate(this);
        this.split.minSize = this.minSize || this[B.minProp];
        this.split.on("beforeapply", this.onSplitMove, this);
        this.split.useShim = this.useShim === true;
        this.maxSize = this.maxSize || this[B.maxProp];
        if (C.hidden) {
            this.splitEl.hide()
        }
        if (this.useSplitTips) {
            this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip: this.splitTip
        }
        if (this.collapsible) {
            this.splitEl.on("dblclick", this.onCollapseClick, this)
        }
    },
    getSize: function() {
        if (this.isCollapsed) {
            return this.collapsedEl.getSize()
        }
        var A = this.panel.getSize();
        if (this.position == "north" || this.position == "south") {
            A.height += this.splitEl.dom.offsetHeight
        } else {
            A.width += this.splitEl.dom.offsetWidth
        }
        return A
    },
    getHMaxSize: function() {
        var B = this.maxSize || 10000;
        var A = this.layout.center;
        return Math.min(B, (this.el.getWidth() + A.el.getWidth()) - A.getMinWidth())
    },
    getVMaxSize: function() {
        var B = this.maxSize || 10000;
        var A = this.layout.center;
        return Math.min(B, (this.el.getHeight() + A.el.getHeight()) - A.getMinHeight())
    },
    onSplitMove: function(B, A) {
        var C = this.panel.getSize();
        this.lastSplitSize = A;
        if (this.position == "north" || this.position == "south") {
            this.panel.setSize(C.width, A);
            this.state.height = A
        } else {
            this.panel.setSize(A, C.height);
            this.state.width = A
        }
        this.layout.layout();
        this.panel.saveState();
        return false
    },
    getSplitBar: function() {
        return this.split
    }
});
Ext.Container.LAYOUTS["border"] = Ext.layout.BorderLayout;
Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {
    labelSeparator: ":",
    getAnchorViewSize: function(A, B) {
        return A.body.getStyleSize()
    },
    setContainer: function(B) {
        Ext.layout.FormLayout.superclass.setContainer.call(this, B);
        if (B.labelAlign) {
            B.addClass("x-form-label-" + B.labelAlign)
        }
        if (B.hideLabels) {
            this.labelStyle = "display:none";
            this.elementStyle = "padding-left:0;";
            this.labelAdjust = 0
        } else {
            this.labelSeparator = B.labelSeparator || this.labelSeparator;
            B.labelWidth = B.labelWidth || 100;
            if (typeof B.labelWidth == "number") {
                var C = (typeof B.labelPad == "number" ? B.labelPad: 5);
                this.labelAdjust = B.labelWidth + C;
                this.labelStyle = "width:" + B.labelWidth + "px;";
                this.elementStyle = "padding-left:" + (B.labelWidth + C) + "px"
            }
            if (B.labelAlign == "top") {
                this.labelStyle = "width:auto;";
                this.labelAdjust = 0;
                this.elementStyle = "padding-left:0;"
            }
        }
        if (!this.fieldTpl) {
            var A = new Ext.Template("<div class=\"x-form-item {5}\" tabIndex=\"-1\">", "<label for=\"{0}\" style=\"{2}\" class=\"x-form-item-label\">{1}{4}</label>", "<div class=\"x-form-element\" id=\"x-form-el-{0}\" style=\"{3}\">", "</div><div class=\"{6}\"></div>", "</div>");
            A.disableFormats = true;
            A.compile();
            Ext.layout.FormLayout.prototype.fieldTpl = A
        }
    },
    renderItem: function(D, A, C) {
        if (D && !D.rendered && D.isFormField && D.inputType != "hidden") {
            var B = [D.id, D.fieldLabel, D.labelStyle || this.labelStyle || "", this.elementStyle || "", typeof D.labelSeparator == "undefined" ? this.labelSeparator: D.labelSeparator, (D.itemCls || this.container.itemCls || "") + (D.hideLabel ? " x-hide-label": ""), D.clearCls || "x-form-clear-left"];
            if (typeof A == "number") {
                A = C.dom.childNodes[A] || null
            }
            if (A) {
                this.fieldTpl.insertBefore(A, B)
            } else {
                this.fieldTpl.append(C, B)
            }
            D.render("x-form-el-" + D.id)
        } else {
            Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments)
        }
    },
    adjustWidthAnchor: function(B, A) {
        return B - (A.isFormField ? (A.hideLabel ? 0 : this.labelAdjust) : 0)
    },
    isValidParent: function(B, A) {
        return true
    }
});
Ext.Container.LAYOUTS["form"] = Ext.layout.FormLayout;
Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, {
    fill: true,
    autoWidth: true,
    titleCollapse: true,
    hideCollapseTool: false,
    collapseFirst: false,
    animate: false,
    sequence: false,
    activeOnTop: false,
    renderItem: function(A) {
        if (this.animate === false) {
            A.animCollapse = false
        }
        A.collapsible = true;
        if (this.autoWidth) {
            A.autoWidth = true
        }
        if (this.titleCollapse) {
            A.titleCollapse = true
        }
        if (this.hideCollapseTool) {
            A.hideCollapseTool = true
        }
        if (this.collapseFirst !== undefined) {
            A.collapseFirst = this.collapseFirst
        }
        if (!this.activeItem && !A.collapsed) {
            this.activeItem = A
        } else {
            if (this.activeItem) {
                A.collapsed = true
            }
        }
        Ext.layout.Accordion.superclass.renderItem.apply(this, arguments);
        A.header.addClass("x-accordion-hd");
        A.on("beforeexpand", this.beforeExpand, this)
    },
    beforeExpand: function(C, B) {
        var A = this.activeItem;
        if (A) {
            if (this.sequence) {
                delete this.activeItem;
                if (!A.collapsed) {
                    A.collapse({
                        callback: function() {
                            C.expand(B || true)
                        },
                        scope: this
                    });
                    return false
                }
            } else {
                A.collapse(this.animate)
            }
        }
        this.activeItem = C;
        if (this.activeOnTop) {
            C.el.dom.parentNode.insertBefore(C.el.dom, C.el.dom.parentNode.firstChild)
        }
        this.layout()
    },
    setItemSize: function(F, E) {
        if (this.fill && F) {
            var B = this.container.items.items;
            var D = 0;
            for (var C = 0, A = B.length; C < A; C++) {
                var G = B[C];
                if (G != F) {
                    D += (G.getSize().height - G.bwrap.getHeight())
                }
            }
            E.height -= D;
            F.setSize(E)
        }
    }
});
Ext.Container.LAYOUTS["accordion"] = Ext.layout.Accordion;
Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
    monitorResize: false,
    setContainer: function(A) {
        Ext.layout.TableLayout.superclass.setContainer.call(this, A);
        this.currentRow = 0;
        this.currentColumn = 0;
        this.cells = []
    },
    onLayout: function(C, E) {
        var D = C.items.items,
        A = D.length,
        F, B;
        if (!this.table) {
            E.addClass("x-table-layout-ct");
            this.table = E.createChild({
                tag: "table",
                cls: "x-table-layout",
                cellspacing: 0,
                cn: {
                    tag: "tbody"
                }
            },
            null, true);
            this.renderAll(C, E)
        }
    },
    getRow: function(A) {
        var B = this.table.tBodies[0].childNodes[A];
        if (!B) {
            B = document.createElement("tr");
            this.table.tBodies[0].appendChild(B)
        }
        return B
    },
    getNextCell: function(H) {
        var A = this.getNextNonSpan(this.currentColumn, this.currentRow);
        var E = this.currentColumn = A[0],
        D = this.currentRow = A[1];
        for (var G = D; G < D + (H.rowspan || 1); G++) {
            if (!this.cells[G]) {
                this.cells[G] = []
            }
            for (var C = E; C < E + (H.colspan || 1); C++) {
                this.cells[G][C] = true
            }
        }
        var F = document.createElement("td");
        if (H.cellId) {
            F.id = H.cellId
        }
        var B = "x-table-layout-cell";
        if (H.cellCls) {
            B += " " + H.cellCls
        }
        F.className = B;
        if (H.colspan) {
            F.colSpan = H.colspan
        }
        if (H.rowspan) {
            F.rowSpan = H.rowspan
        }
        this.getRow(D).appendChild(F);
        return F
    },
    getNextNonSpan: function(A, C) {
        var B = this.columns;
        while ((B && A >= B) || (this.cells[C] && this.cells[C][A])) {
            if (B && A >= B) {
                C++;
                A = 0
            } else {
                A++
            }
        }
        return [A, C]
    },
    renderItem: function(C, A, B) {
        if (C && !C.rendered) {
            C.render(this.getNextCell(C))
        }
    },
    isValidParent: function(B, A) {
        return true
    }
});
Ext.Container.LAYOUTS["table"] = Ext.layout.TableLayout;
Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
    extraCls: "x-abs-layout-item",
    isForm: false,
    setContainer: function(A) {
        Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, A);
        if (A.isXType("form")) {
            this.isForm = true
        }
    },
    onLayout: function(A, B) {
        if (this.isForm) {
            A.body.position()
        } else {
            B.position()
        }
        Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, A, B)
    },
    getAnchorViewSize: function(A, B) {
        return this.isForm ? A.body.getStyleSize() : Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this, A, B)
    },
    isValidParent: function(B, A) {
        return this.isForm ? true: Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this, B, A)
    },
    adjustWidthAnchor: function(B, A) {
        return B ? B - A.getPosition(true)[0] : B
    },
    adjustHeightAnchor: function(B, A) {
        return B ? B - A.getPosition(true)[1] : B
    }
});
Ext.Container.LAYOUTS["absolute"] = Ext.layout.AbsoluteLayout;
Ext.Viewport = Ext.extend(Ext.Container, {
    initComponent: function() {
        Ext.Viewport.superclass.initComponent.call(this);
        document.getElementsByTagName("html")[0].className += " x-viewport";
        this.el = Ext.getBody();
        this.el.setHeight = Ext.emptyFn;
        this.el.setWidth = Ext.emptyFn;
        this.el.setSize = Ext.emptyFn;
        this.el.dom.scroll = "no";
        this.allowDomMove = false;
        this.autoWidth = true;
        this.autoHeight = true;
        Ext.EventManager.onWindowResize(this.fireResize, this);
        this.renderTo = this.el
    },
    fireResize: function(A, B) {
        this.fireEvent("resize", this, A, B, A, B)
    }
});
Ext.reg("viewport", Ext.Viewport);
Ext.Panel = Ext.extend(Ext.Container, {
    baseCls: "x-panel",
    collapsedCls: "x-panel-collapsed",
    maskDisabled: true,
    animCollapse: Ext.enableFx,
    headerAsText: true,
    buttonAlign: "right",
    collapsed: false,
    collapseFirst: true,
    minButtonWidth: 75,
    elements: "body",
    toolTarget: "header",
    collapseEl: "bwrap",
    slideAnchor: "t",
    disabledClass: "",
    deferHeight: true,
    expandDefaults: {
        duration: 0.25
    },
    collapseDefaults: {
        duration: 0.25
    },
    initComponent: function() {
        Ext.Panel.superclass.initComponent.call(this);
        this.addEvents("bodyresize", "titlechange", "collapse", "expand", "beforecollapse", "beforeexpand", "beforeclose", "close", "activate", "deactivate");
        if (this.tbar) {
            this.elements += ",tbar";
            if (typeof this.tbar == "object") {
                this.topToolbar = this.tbar
            }
            delete this.tbar
        }
        if (this.bbar) {
            this.elements += ",bbar";
            if (typeof this.bbar == "object") {
                this.bottomToolbar = this.bbar
            }
            delete this.bbar
        }
        if (this.header === true) {
            this.elements += ",header";
            delete this.header
        } else {
            if (this.title && this.header !== false) {
                this.elements += ",header"
            }
        }
        if (this.footer === true) {
            this.elements += ",footer";
            delete this.footer
        }
        if (this.buttons) {
            var C = this.buttons;
            this.buttons = [];
            for (var B = 0, A = C.length; B < A; B++) {
                if (C[B].render) {
                    C[B].ownerCt = this;
                    this.buttons.push(C[B])
                } else {
                    this.addButton(C[B])
                }
            }
        }
        if (this.autoLoad) {
            this.on("render", this.doAutoLoad, this, {
                delay: 10
            })
        }
    },
    createElement: function(A, C) {
        if (this[A]) {
            C.appendChild(this[A].dom);
            return
        }
        if (A === "bwrap" || this.elements.indexOf(A) != -1) {
            if (this[A + "Cfg"]) {
                this[A] = Ext.fly(C).createChild(this[A + "Cfg"])
            } else {
                var B = document.createElement("div");
                B.className = this[A + "Cls"];
                this[A] = Ext.get(C.appendChild(B))
            }
        }
    },
    onRender: function(H, G) {
        Ext.Panel.superclass.onRender.call(this, H, G);
        this.createClasses();
        if (this.el) {
            this.el.addClass(this.baseCls);
            this.header = this.el.down("." + this.headerCls);
            this.bwrap = this.el.down("." + this.bwrapCls);
            var M = this.bwrap ? this.bwrap: this.el;
            this.tbar = M.down("." + this.tbarCls);
            this.body = M.down("." + this.bodyCls);
            this.bbar = M.down("." + this.bbarCls);
            this.footer = M.down("." + this.footerCls);
            this.fromMarkup = true
        } else {
            this.el = H.createChild({
                id: this.id,
                cls: this.baseCls
            },
            G)
        }
        var A = this.el,
        K = A.dom;
        if (this.cls) {
            this.el.addClass(this.cls)
        }
        if (this.buttons) {
            this.elements += ",footer"
        }
        if (this.frame) {
            A.insertHtml("afterBegin", String.format(Ext.Element.boxMarkup, this.baseCls));
            this.createElement("header", K.firstChild.firstChild.firstChild);
            this.createElement("bwrap", K);
            var O = this.bwrap.dom;
            var E = K.childNodes[1],
            B = K.childNodes[2];
            O.appendChild(E);
            O.appendChild(B);
            var P = O.firstChild.firstChild.firstChild;
            this.createElement("tbar", P);
            this.createElement("body", P);
            this.createElement("bbar", P);
            this.createElement("footer", O.lastChild.firstChild.firstChild);
            if (!this.footer) {
                this.bwrap.dom.lastChild.className += " x-panel-nofooter"
            }
        } else {
            this.createElement("header", K);
            this.createElement("bwrap", K);
            var O = this.bwrap.dom;
            this.createElement("tbar", O);
            this.createElement("body", O);
            this.createElement("bbar", O);
            this.createElement("footer", O);
            if (!this.header) {
                this.body.addClass(this.bodyCls + "-noheader");
                if (this.tbar) {
                    this.tbar.addClass(this.tbarCls + "-noheader")
                }
            }
        }
        if (this.border === false) {
            this.el.addClass(this.baseCls + "-noborder");
            this.body.addClass(this.bodyCls + "-noborder");
            if (this.header) {
                this.header.addClass(this.headerCls + "-noborder")
            }
            if (this.footer) {
                this.footer.addClass(this.footerCls + "-noborder")
            }
            if (this.tbar) {
                this.tbar.addClass(this.tbarCls + "-noborder")
            }
            if (this.bbar) {
                this.bbar.addClass(this.bbarCls + "-noborder")
            }
        }
        if (this.bodyBorder === false) {
            this.body.addClass(this.bodyCls + "-noborder")
        }
        if (this.bodyStyle) {
            this.body.applyStyles(this.bodyStyle)
        }
        this.bwrap.enableDisplayMode("block");
        if (this.header) {
            this.header.unselectable();
            if (this.headerAsText) {
                this.header.dom.innerHTML = "<span class=\"" + this.headerTextCls + "\">" + this.header.dom.innerHTML + "</span>";
                if (this.iconCls) {
                    this.setIconClass(this.iconCls)
                }
            }
        }
        if (this.floating) {
            this.makeFloating(this.floating)
        }
        if (this.collapsible) {
            this.tools = this.tools ? this.tools.slice(0) : [];
            if (!this.hideCollapseTool) {
                this.tools[this.collapseFirst ? "unshift": "push"]({
                    id: "toggle",
                    handler: this.toggleCollapse,
                    scope: this
                })
            }
            if (this.titleCollapse && this.header) {
                this.header.on("click", this.toggleCollapse, this);
                this.header.setStyle("cursor", "pointer")
            }
        }
        if (this.tools) {
            var J = this.tools;
            this.tools = {};
            this.addTool.apply(this, J)
        } else {
            this.tools = {}
        }
        if (this.buttons && this.buttons.length > 0) {
            var D = this.footer.createChild({
                cls: "x-panel-btns-ct",
                cn: {
                    cls: "x-panel-btns x-panel-btns-" + this.buttonAlign,
                    html: "<table cellspacing=\"0\"><tbody><tr></tr></tbody></table><div class=\"x-clear\"></div>"
                }
            },
            null, true);
            var L = D.getElementsByTagName("tr")[0];
            for (var F = 0, I = this.buttons.length; F < I; F++) {
                var N = this.buttons[F];
                var C = document.createElement("td");
                C.className = "x-panel-btn-td";
                N.render(L.appendChild(C))
            }
        }
        if (this.tbar && this.topToolbar) {
            if (Ext.isArray(this.topToolbar)) {
                this.topToolbar = new Ext.Toolbar(this.topToolbar)
            }
            this.topToolbar.render(this.tbar);
            this.topToolbar.ownerCt = this
        }
        if (this.bbar && this.bottomToolbar) {
            if (Ext.isArray(this.bottomToolbar)) {
                this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar)
            }
            this.bottomToolbar.render(this.bbar);
            this.bottomToolbar.ownerCt = this
        }
    },
    setIconClass: function(B) {
        var A = this.iconCls;
        this.iconCls = B;
        if (this.rendered && this.header) {
            if (this.frame) {
                this.header.addClass("x-panel-icon");
                this.header.replaceClass(A, this.iconCls)
            } else {
                var D = this.header.dom;
                var C = D.firstChild && String(D.firstChild.tagName).toLowerCase() == "img" ? D.firstChild: null;
                if (C) {
                    Ext.fly(C).replaceClass(A, this.iconCls)
                } else {
                    Ext.DomHelper.insertBefore(D.firstChild, {
                        tag: "img",
                        src: Ext.BLANK_IMAGE_URL,
                        cls: "x-panel-inline-icon " + this.iconCls
                    })
                }
            }
        }
    },
    makeFloating: function(A) {
        this.floating = true;
        this.el = new Ext.Layer(typeof A == "object" ? A: {
            shadow: this.shadow !== undefined ? this.shadow: "sides",
            shadowOffset: this.shadowOffset,
            constrain: false,
            shim: this.shim === false ? false: undefined
        },
        this.el)
    },
    getTopToolbar: function() {
        return this.topToolbar
    },
    getBottomToolbar: function() {
        return this.bottomToolbar
    },
    addButton: function(A, D, C) {
        var E = {
            handler: D,
            scope: C,
            minWidth: this.minButtonWidth,
            hideParent: true
        };
        if (typeof A == "string") {
            E.text = A
        } else {
            Ext.apply(E, A)
        }
        var B = new Ext.Button(E);
        B.ownerCt = this;
        if (!this.buttons) {
            this.buttons = []
        }
        this.buttons.push(B);
        return B
    },
    addTool: function() {
        if (!this[this.toolTarget]) {
            return
        }
        if (!this.toolTemplate) {
            var F = new Ext.Template("<div class=\"x-tool x-tool-{id}\">&#160;</div>");
            F.disableFormats = true;
            F.compile();
            Ext.Panel.prototype.toolTemplate = F
        }
        for (var E = 0, C = arguments, B = C.length; E < B; E++) {
            var A = C[E],
            G = "x-tool-" + A.id + "-over";
            var D = this.toolTemplate.insertFirst((A.align !== "left") ? this[this.toolTarget] : this[this.toolTarget].child("span"), A, true);
            this.tools[A.id] = D;
            D.enableDisplayMode("block");
            D.on("click", this.createToolHandler(D, A, G, this));
            if (A.on) {
                D.on(A.on)
            }
            if (A.hidden) {
                D.hide()
            }
            if (A.qtip) {
                if (typeof A.qtip == "object") {
                    Ext.QuickTips.register(Ext.apply({
                        target: D.id
                    },
                    A.qtip))
                } else {
                    D.dom.qtip = A.qtip
                }
            }
            D.addClassOnOver(G)
        }
    },
    onShow: function() {
        if (this.floating) {
            return this.el.show()
        }
        Ext.Panel.superclass.onShow.call(this)
    },
    onHide: function() {
        if (this.floating) {
            return this.el.hide()
        }
        Ext.Panel.superclass.onHide.call(this)
    },
    createToolHandler: function(C, A, D, B) {
        return function(E) {
            C.removeClass(D);
            E.stopEvent();
            if (A.handler) {
                A.handler.call(A.scope || C, E, C, B)
            }
        }
    },
    afterRender: function() {
        if (this.fromMarkup && this.height === undefined && !this.autoHeight) {
            this.height = this.el.getHeight()
        }
        if (this.floating && !this.hidden && !this.initHidden) {
            this.el.show()
        }
        if (this.title) {
            this.setTitle(this.title)
        }
        this.setAutoScroll();
        if (this.html) {
            this.body.update(typeof this.html == "object" ? Ext.DomHelper.markup(this.html) : this.html);
            delete this.html
        }
        if (this.contentEl) {
            var A = Ext.getDom(this.contentEl);
            Ext.fly(A).removeClass(["x-hidden", "x-hide-display"]);
            this.body.dom.appendChild(A)
        }
        if (this.collapsed) {
            this.collapsed = false;
            this.collapse(false)
        }
        Ext.Panel.superclass.afterRender.call(this);
        this.initEvents()
    },
    setAutoScroll: function() {
        if (this.rendered && this.autoScroll) {
            var A = this.body || this.el;
            if (A) {
                A.setOverflow("auto")
            }
        }
    },
    getKeyMap: function() {
        if (!this.keyMap) {
            this.keyMap = new Ext.KeyMap(this.el, this.keys)
        }
        return this.keyMap
    },
    initEvents: function() {
        if (this.keys) {
            this.getKeyMap()
        }
        if (this.draggable) {
            this.initDraggable()
        }
    },
    initDraggable: function() {
        this.dd = new Ext.Panel.DD(this, typeof this.draggable == "boolean" ? null: this.draggable)
    },
    beforeEffect: function() {
        if (this.floating) {
            this.el.beforeAction()
        }
        this.el.addClass("x-panel-animated")
    },
    afterEffect: function() {
        this.syncShadow();
        this.el.removeClass("x-panel-animated")
    },
    createEffect: function(B, A, C) {
        var D = {
            scope: C,
            block: true
        };
        if (B === true) {
            D.callback = A;
            return D
        } else {
            if (!B.callback) {
                D.callback = A
            } else {
                D.callback = function() {
                    A.call(C);
                    Ext.callback(B.callback, B.scope)
                }
            }
        }
        return Ext.applyIf(D, B)
    },
    collapse: function(B) {
        if (this.collapsed || this.el.hasFxBlock() || this.fireEvent("beforecollapse", this, B) === false) {
            return
        }
        var A = B === true || (B !== false && this.animCollapse);
        this.beforeEffect();
        this.onCollapse(A, B);
        return this
    },
    onCollapse: function(A, B) {
        if (A) {
            this[this.collapseEl].slideOut(this.slideAnchor, Ext.apply(this.createEffect(B || true, this.afterCollapse, this), this.collapseDefaults))
        } else {
            this[this.collapseEl].hide();
            this.afterCollapse()
        }
    },
    afterCollapse: function() {
        this.collapsed = true;
        this.el.addClass(this.collapsedCls);
        this.afterEffect();
        this.fireEvent("collapse", this)
    },
    expand: function(B) {
        if (!this.collapsed || this.el.hasFxBlock() || this.fireEvent("beforeexpand", this, B) === false) {
            return
        }
        var A = B === true || (B !== false && this.animCollapse);
        this.el.removeClass(this.collapsedCls);
        this.beforeEffect();
        this.onExpand(A, B);
        return this
    },
    onExpand: function(A, B) {
        if (A) {
            this[this.collapseEl].slideIn(this.slideAnchor, Ext.apply(this.createEffect(B || true, this.afterExpand, this), this.expandDefaults))
        } else {
            this[this.collapseEl].show();
            this.afterExpand()
        }
    },
    afterExpand: function() {
        this.collapsed = false;
        this.afterEffect();
        this.fireEvent("expand", this)
    },
    toggleCollapse: function(A) {
        this[this.collapsed ? "expand": "collapse"](A);
        return this
    },
    onDisable: function() {
        if (this.rendered && this.maskDisabled) {
            this.el.mask()
        }
        Ext.Panel.superclass.onDisable.call(this)
    },
    onEnable: function() {
        if (this.rendered && this.maskDisabled) {
            this.el.unmask()
        }
        Ext.Panel.superclass.onEnable.call(this)
    },
    onResize: function(A, B) {
        if (A !== undefined || B !== undefined) {
            if (!this.collapsed) {
                if (typeof A == "number") {
                    this.body.setWidth(this.adjustBodyWidth(A - this.getFrameWidth()))
                } else {
                    if (A == "auto") {
                        this.body.setWidth(A)
                    }
                }
                if (typeof B == "number") {
                    this.body.setHeight(this.adjustBodyHeight(B - this.getFrameHeight()))
                } else {
                    if (B == "auto") {
                        this.body.setHeight(B)
                    }
                }
                if (this.disabled && this.el._mask) {
                    this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight())
                }
            } else {
                this.queuedBodySize = {
                    width: A,
                    height: B
                };
                if (!this.queuedExpand && this.allowQueuedExpand !== false) {
                    this.queuedExpand = true;
                    this.on("expand",
                    function() {
                        delete this.queuedExpand;
                        this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
                        this.doLayout()
                    },
                    this, {
                        single: true
                    })
                }
            }
            this.fireEvent("bodyresize", this, A, B)
        }
        this.syncShadow()
    },
    adjustBodyHeight: function(A) {
        return A
    },
    adjustBodyWidth: function(A) {
        return A
    },
    onPosition: function() {
        this.syncShadow()
    },
    getFrameWidth: function() {
        var B = this.el.getFrameWidth("lr");
        if (this.frame) {
            var A = this.bwrap.dom.firstChild;
            B += (Ext.fly(A).getFrameWidth("l") + Ext.fly(A.firstChild).getFrameWidth("r"));
            var C = this.bwrap.dom.firstChild.firstChild.firstChild;
            B += Ext.fly(C).getFrameWidth("lr")
        }
        return B
    },
    getFrameHeight: function() {
        var A = this.el.getFrameWidth("tb");
        A += (this.tbar ? this.tbar.getHeight() : 0) + (this.bbar ? this.bbar.getHeight() : 0);
        if (this.frame) {
            var C = this.el.dom.firstChild;
            var D = this.bwrap.dom.lastChild;
            A += (C.offsetHeight + D.offsetHeight);
            var B = this.bwrap.dom.firstChild.firstChild.firstChild;
            A += Ext.fly(B).getFrameWidth("tb")
        } else {
            A += (this.header ? this.header.getHeight() : 0) + (this.footer ? this.footer.getHeight() : 0)
        }
        return A
    },
    getInnerWidth: function() {
        return this.getSize().width - this.getFrameWidth()
    },
    getInnerHeight: function() {
        return this.getSize().height - this.getFrameHeight()
    },
    syncShadow: function() {
        if (this.floating) {
            this.el.sync(true)
        }
    },
    getLayoutTarget: function() {
        return this.body
    },
    setTitle: function(B, A) {
        this.title = B;
        if (this.header && this.headerAsText) {
            this.header.child("span").update(B)
        }
        if (A) {
            this.setIconClass(A)
        }
        this.fireEvent("titlechange", this, B);
        return this
    },
    getUpdater: function() {
        return this.body.getUpdater()
    },
    load: function() {
        var A = this.body.getUpdater();
        A.update.apply(A, arguments);
        return this
    },
    beforeDestroy: function() {
        Ext.Element.uncache(this.header, this.tbar, this.bbar, this.footer, this.body);
        if (this.tools) {
            for (var B in this.tools) {
                Ext.destroy(this.tools[B])
            }
        }
        if (this.buttons) {
            for (var A in this.buttons) {
                Ext.destroy(this.buttons[A])
            }
        }
        Ext.destroy(this.topToolbar, this.bottomToolbar);
        Ext.Panel.superclass.beforeDestroy.call(this)
    },
    createClasses: function() {
        this.headerCls = this.baseCls + "-header";
        this.headerTextCls = this.baseCls + "-header-text";
        this.bwrapCls = this.baseCls + "-bwrap";
        this.tbarCls = this.baseCls + "-tbar";
        this.bodyCls = this.baseCls + "-body";
        this.bbarCls = this.baseCls + "-bbar";
        this.footerCls = this.baseCls + "-footer"
    },
    createGhost: function(A, E, B) {
        var D = document.createElement("div");
        D.className = "x-panel-ghost " + (A ? A: "");
        if (this.header) {
            D.appendChild(this.el.dom.firstChild.cloneNode(true))
        }
        Ext.fly(D.appendChild(document.createElement("ul"))).setHeight(this.bwrap.getHeight());
        D.style.width = this.el.dom.offsetWidth + "px";
        if (!B) {
            this.container.dom.appendChild(D)
        } else {
            Ext.getDom(B).appendChild(D)
        }
        if (E !== false && this.el.useShim !== false) {
            var C = new Ext.Layer({
                shadow: false,
                useDisplay: true,
                constrain: false
            },
            D);
            C.show();
            return C
        } else {
            return new Ext.Element(D)
        }
    },
    doAutoLoad: function() {
        this.body.load(typeof this.autoLoad == "object" ? this.autoLoad: {
            url: this.autoLoad
        })
    }
});
Ext.reg("panel", Ext.Panel);
Ext.Window = Ext.extend(Ext.Panel, {
    baseCls: "x-window",
    resizable: true,
    draggable: true,
    closable: true,
    constrain: false,
    constrainHeader: false,
    plain: false,
    minimizable: false,
    maximizable: false,
    minHeight: 100,
    minWidth: 200,
    expandOnShow: true,
    closeAction: "close",
    elements: "header,body",
    collapsible: false,
    initHidden: true,
    monitorResize: true,
    frame: true,
    floating: true,
    initComponent: function() {
        Ext.Window.superclass.initComponent.call(this);
        this.addEvents("resize", "maximize", "minimize", "restore")
    },
    getState: function() {
        return Ext.apply(Ext.Window.superclass.getState.call(this) || {},
        this.getBox())
    },
    onRender: function(B, A) {
        Ext.Window.superclass.onRender.call(this, B, A);
        if (this.plain) {
            this.el.addClass("x-window-plain")
        }
        this.focusEl = this.el.createChild({
            tag: "a",
            href: "#",
            cls: "x-dlg-focus",
            tabIndex: "-1",
            html: "&#160;"
        });
        this.focusEl.swallowEvent("click", true);
        this.proxy = this.el.createProxy("x-window-proxy");
        this.proxy.enableDisplayMode("block");
        if (this.modal) {
            this.mask = this.container.createChild({
                cls: "ext-el-mask"
            },
            this.el.dom);
            this.mask.enableDisplayMode("block");
            this.mask.hide()
        }
    },
    initEvents: function() {
        Ext.Window.superclass.initEvents.call(this);
        if (this.animateTarget) {
            this.setAnimateTarget(this.animateTarget)
        }
        if (this.resizable) {
            this.resizer = new Ext.Resizable(this.el, {
                minWidth: this.minWidth,
                minHeight: this.minHeight,
                handles: this.resizeHandles || "all",
                pinned: true,
                resizeElement: this.resizerAction
            });
            this.resizer.window = this;
            this.resizer.on("beforeresize", this.beforeResize, this)
        }
        if (this.draggable) {
            this.header.addClass("x-window-draggable")
        }
        this.initTools();
        this.el.on("mousedown", this.toFront, this);
        this.manager = this.manager || Ext.WindowMgr;
        this.manager.register(this);
        this.hidden = true;
        if (this.maximized) {
            this.maximized = false;
            this.maximize()
        }
        if (this.closable) {
            var A = this.getKeyMap();
            A.on(27, this.onEsc, this);
            A.disable()
        }
    },
    initDraggable: function() {
        this.dd = new Ext.Window.DD(this)
    },
    onEsc: function() {
        this[this.closeAction]()
    },
    beforeDestroy: function() {
        Ext.destroy(this.resizer, this.dd, this.proxy, this.mask);
        Ext.Window.superclass.beforeDestroy.call(this)
    },
    onDestroy: function() {
        if (this.manager) {
            this.manager.unregister(this)
        }
        Ext.Window.superclass.onDestroy.call(this)
    },
    initTools: function() {
        if (this.minimizable) {
            this.addTool({
                id: "minimize",
                handler: this.minimize.createDelegate(this, [])
            })
        }
        if (this.maximizable) {
            this.addTool({
                id: "maximize",
                handler: this.maximize.createDelegate(this, [])
            });
            this.addTool({
                id: "restore",
                handler: this.restore.createDelegate(this, []),
                hidden: true
            });
            this.header.on("dblclick", this.toggleMaximize, this)
        }
        if (this.closable) {
            this.addTool({
                id: "close",
                handler: this[this.closeAction].createDelegate(this, [])
            })
        }
    },
    resizerAction: function() {
        var A = this.proxy.getBox();
        this.proxy.hide();
        this.window.handleResize(A);
        return A
    },
    beforeResize: function() {
        this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40);
        this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
        this.resizeBox = this.el.getBox()
    },
    updateHandles: function() {
        if (Ext.isIE && this.resizer) {
            this.resizer.syncHandleHeight();
            this.el.repaint()
        }
    },
    handleResize: function(B) {
        var A = this.resizeBox;
        if (A.x != B.x || A.y != B.y) {
            this.updateBox(B)
        } else {
            this.setSize(B)
        }
        this.focus();
        this.updateHandles();
        this.saveState();
        if (this.layout) {
            this.doLayout()
        }
        this.fireEvent("resize", this, B.width, B.height)
    },
    focus: function() {
        var C = this.focusEl,
        A = this.defaultButton,
        B = typeof A;
        if (B != "undefined") {
            if (B == "number") {
                C = this.buttons[A]
            } else {
                if (B == "string") {
                    C = Ext.getCmp(A)
                } else {
                    C = A
                }
            }
        }
        C.focus.defer(10, C)
    },
    setAnimateTarget: function(A) {
        A = Ext.get(A);
        this.animateTarget = A
    },
    beforeShow: function() {
        delete this.el.lastXY;
        delete this.el.lastLT;
        if (this.x === undefined || this.y === undefined) {
            var A = this.el.getAlignToXY(this.container, "c-c");
            var B = this.el.translatePoints(A[0], A[1]);
            this.x = this.x === undefined ? B.left: this.x;
            this.y = this.y === undefined ? B.top: this.y
        }
        this.el.setLeftTop(this.x, this.y);
        if (this.expandOnShow) {
            this.expand(false)
        }
        if (this.modal) {
            Ext.getBody().addClass("x-body-masked");
            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
            this.mask.show()
        }
    },
    show: function(C, A, B) {
        if (!this.rendered) {
            this.render(Ext.getBody())
        }
        if (this.hidden === false) {
            this.toFront();
            return
        }
        if (this.fireEvent("beforeshow", this) === false) {
            return
        }
        if (A) {
            this.on("show", A, B, {
                single: true
            })
        }
        this.hidden = false;
        if (C !== undefined) {
            this.setAnimateTarget(C)
        }
        this.beforeShow();
        if (this.animateTarget) {
            this.animShow()
        } else {
            this.afterShow()
        }
    },
    afterShow: function() {
        this.proxy.hide();
        this.el.setStyle("display", "block");
        this.el.show();
        if (this.maximized) {
            this.fitContainer()
        }
        if (Ext.isMac && Ext.isGecko) {
            this.cascade(this.setAutoScroll)
        }
        if (this.monitorResize || this.modal || this.constrain || this.constrainHeader) {
            Ext.EventManager.onWindowResize(this.onWindowResize, this)
        }
        this.doConstrain();
        if (this.layout) {
            this.doLayout()
        }
        if (this.keyMap) {
            this.keyMap.enable()
        }
        this.toFront();
        this.updateHandles();
        this.fireEvent("show", this)
    },
    animShow: function() {
        this.proxy.show();
        this.proxy.setBox(this.animateTarget.getBox());
        this.proxy.setOpacity(0);
        var A = this.getBox(false);
        A.callback = this.afterShow;
        A.scope = this;
        A.duration = 0.25;
        A.easing = "easeNone";
        A.opacity = 0.5;
        A.block = true;
        this.el.setStyle("display", "none");
        this.proxy.shift(A)
    },
    hide: function(C, A, B) {
        if (this.activeGhost) {
            this.hide.defer(100, this, [C, A, B]);
            return
        }
        if (this.hidden || this.fireEvent("beforehide", this) === false) {
            return
        }
        if (A) {
            this.on("hide", A, B, {
                single: true
            })
        }
        this.hidden = true;
        if (C !== undefined) {
            this.setAnimateTarget(C)
        }
        if (this.animateTarget) {
            this.animHide()
        } else {
            this.el.hide();
            this.afterHide()
        }
    },
    afterHide: function() {
        this.proxy.hide();
        if (this.monitorResize || this.modal || this.constrain || this.constrainHeader) {
            Ext.EventManager.removeResizeListener(this.onWindowResize, this)
        }
        if (this.modal) {
            this.mask.hide();
            Ext.getBody().removeClass("x-body-masked")
        }
        if (this.keyMap) {
            this.keyMap.disable()
        }
        this.fireEvent("hide", this)
    },
    animHide: function() {
        this.proxy.setOpacity(0.5);
        this.proxy.show();
        var B = this.getBox(false);
        this.proxy.setBox(B);
        this.el.hide();
        var A = this.animateTarget.getBox();
        A.callback = this.afterHide;
        A.scope = this;
        A.duration = 0.25;
        A.easing = "easeNone";
        A.block = true;
        A.opacity = 0;
        this.proxy.shift(A)
    },
    onWindowResize: function() {
        if (this.maximized) {
            this.fitContainer()
        }
        if (this.modal) {
            this.mask.setSize("100%", "100%");
            var A = this.mask.dom.offsetHeight;
            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true))
        }
        this.doConstrain()
    },
    doConstrain: function() {
        if (this.constrain || this.constrainHeader) {
            var B;
            if (this.constrain) {
                B = {
                    right: this.el.shadowOffset,
                    left: this.el.shadowOffset,
                    bottom: this.el.shadowOffset
                }
            } else {
                var A = this.getSize();
                B = {
                    right: -(A.width - 100),
                    bottom: -(A.height - 25)
                }
            }
            var C = this.el.getConstrainToXY(this.container, true, B);
            if (C) {
                this.setPosition(C[0], C[1])
            }
        }
    },
    ghost: function(A) {
        var C = this.createGhost(A);
        var B = this.getBox(true);
        C.setLeftTop(B.x, B.y);
        C.setWidth(B.width);
        this.el.hide();
        this.activeGhost = C;
        return C
    },
    unghost: function(B, A) {
        if (B !== false) {
            this.el.show();
            this.focus();
            if (Ext.isMac && Ext.isGecko) {
                this.cascade(this.setAutoScroll)
            }
        }
        if (A !== false) {
            this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true))
        }
        this.activeGhost.hide();
        this.activeGhost.remove();
        delete this.activeGhost
    },
    minimize: function() {
        this.fireEvent("minimize", this)
    },
    close: function() {
        if (this.fireEvent("beforeclose", this) !== false) {
            this.hide(null,
            function() {
                this.fireEvent("close", this);
                this.destroy()
            },
            this)
        }
    },
    maximize: function() {
        if (!this.maximized) {
            this.expand(false);
            this.restoreSize = this.getSize();
            this.restorePos = this.getPosition(true);
            if (this.maximizable) {
                this.tools.maximize.hide();
                this.tools.restore.show()
            }
            this.maximized = true;
            this.el.disableShadow();
            if (this.dd) {
                this.dd.lock()
            }
            if (this.collapsible) {
                this.tools.toggle.hide()
            }
            this.el.addClass("x-window-maximized");
            this.container.addClass("x-window-maximized-ct");
            this.setPosition(0, 0);
            this.fitContainer();
            this.fireEvent("maximize", this)
        }
    },
    restore: function() {
        if (this.maximized) {
            this.el.removeClass("x-window-maximized");
            this.tools.restore.hide();
            this.tools.maximize.show();
            this.setPosition(this.restorePos[0], this.restorePos[1]);
            this.setSize(this.restoreSize.width, this.restoreSize.height);
            delete this.restorePos;
            delete this.restoreSize;
            this.maximized = false;
            this.el.enableShadow(true);
            if (this.dd) {
                this.dd.unlock()
            }
            if (this.collapsible) {
                this.tools.toggle.show()
            }
            this.container.removeClass("x-window-maximized-ct");
            this.doConstrain();
            this.fireEvent("restore", this)
        }
    },
    toggleMaximize: function() {
        this[this.maximized ? "restore": "maximize"]()
    },
    fitContainer: function() {
        var A = this.container.getViewSize();
        this.setSize(A.width, A.height)
    },
    setZIndex: function(A) {
        if (this.modal) {
            this.mask.setStyle("z-index", A)
        }
        this.el.setZIndex(++A);
        A += 5;
        if (this.resizer) {
            this.resizer.proxy.setStyle("z-index", ++A)
        }
        this.lastZIndex = A
    },
    alignTo: function(B, A, C) {
        var D = this.el.getAlignToXY(B, A, C);
        this.setPagePosition(D[0], D[1]);
        return this
    },
    anchorTo: function(C, G, D, B, F) {
        var E = function() {
            this.alignTo(C, G, D)
        };
        Ext.EventManager.onWindowResize(E, this);
        var A = typeof B;
        if (A != "undefined") {
            Ext.EventManager.on(window, "scroll", E, this, {
                buffer: A == "number" ? B: 50
            })
        }
        E.call(this);
        this[F] = E;
        return this
    },
    toFront: function() {
        if (this.manager.bringToFront(this)) {
            this.focus()
        }
        return this
    },
    setActive: function(A) {
        if (A) {
            if (!this.maximized) {
                this.el.enableShadow(true)
            }
            this.fireEvent("activate", this)
        } else {
            this.el.disableShadow();
            this.fireEvent("deactivate", this)
        }
    },
    toBack: function() {
        this.manager.sendToBack(this);
        return this
    },
    center: function() {
        var A = this.el.getAlignToXY(this.container, "c-c");
        this.setPagePosition(A[0], A[1]);
        return this
    }
});
Ext.reg("window", Ext.Window);
Ext.Window.DD = function(A) {
    this.win = A;
    Ext.Window.DD.superclass.constructor.call(this, A.el.id, "WindowDD-" + A.id);
    this.setHandleElId(A.header.id);
    this.scroll = false
};
Ext.extend(Ext.Window.DD, Ext.dd.DD, {
    moveOnly: true,
    headerOffsets: [100, 25],
    startDrag: function() {
        var A = this.win;
        this.proxy = A.ghost();
        if (A.constrain !== false) {
            var C = A.el.shadowOffset;
            this.constrainTo(A.container, {
                right: C,
                left: C,
                bottom: C
            })
        } else {
            if (A.constrainHeader !== false) {
                var B = this.proxy.getSize();
                this.constrainTo(A.container, {
                    right: -(B.width - this.headerOffsets[0]),
                    bottom: -(B.height - this.headerOffsets[1])
                })
            }
        }
    },
    b4Drag: Ext.emptyFn,
    onDrag: function(A) {
        this.alignElWithMouse(this.proxy, A.getPageX(), A.getPageY())
    },
    endDrag: function(A) {
        this.win.unghost();
        this.win.saveState()
    }
});
Ext.WindowGroup = function() {
    var F = {};
    var D = [];
    var E = null;
    var C = function(I, H) {
        return (!I._lastAccess || I._lastAccess < H._lastAccess) ? -1 : 1
    };
    var G = function() {
        var J = D,
        H = J.length;
        if (H > 0) {
            J.sort(C);
            var I = J[0].manager.zseed;
            for (var K = 0; K < H; K++) {
                var L = J[K];
                if (L && !L.hidden) {
                    L.setZIndex(I + (K * 10))
                }
            }
        }
        A()
    };
    var B = function(H) {
        if (H != E) {
            if (E) {
                E.setActive(false)
            }
            E = H;
            if (H) {
                H.setActive(true)
            }
        }
    };
    var A = function() {
        for (var H = D.length - 1; H >= 0; --H) {
            if (!D[H].hidden) {
                B(D[H]);
                return
            }
        }
        B(null)
    };
    return {
        zseed: 9000,
        register: function(H) {
            F[H.id] = H;
            D.push(H);
            H.on("hide", A)
        },
        unregister: function(H) {
            delete F[H.id];
            H.un("hide", A);
            D.remove(H)
        },
        get: function(H) {
            return typeof H == "object" ? H: F[H]
        },
        bringToFront: function(H) {
            H = this.get(H);
            if (H != E) {
                H._lastAccess = new Date().getTime();
                G();
                return true
            }
            return false
        },
        sendToBack: function(H) {
            H = this.get(H);
            H._lastAccess = -(new Date().getTime());
            G();
            return H
        },
        hideAll: function() {
            for (var H in F) {
                if (F[H] && typeof F[H] != "function" && F[H].isVisible()) {
                    F[H].hide()
                }
            }
        },
        getActive: function() {
            return E
        },
        getBy: function(J, I) {
            var K = [];
            for (var H = D.length - 1; H >= 0; --H) {
                var L = D[H];
                if (J.call(I || L, L) !== false) {
                    K.push(L)
                }
            }
            return K
        },
        each: function(I, H) {
            for (var J in F) {
                if (F[J] && typeof F[J] != "function") {
                    if (I.call(H || F[J], F[J]) === false) {
                        return
                    }
                }
            }
        }
    }
};
Ext.WindowMgr = new Ext.WindowGroup();
Ext.dd.PanelProxy = function(A, B) {
    this.panel = A;
    this.id = this.panel.id + "-ddproxy";
    Ext.apply(this, B)
};
Ext.dd.PanelProxy.prototype = {
    insertProxy: true,
    setStatus: Ext.emptyFn,
    reset: Ext.emptyFn,
    update: Ext.emptyFn,
    stop: Ext.emptyFn,
    sync: Ext.emptyFn,
    getEl: function() {
        return this.ghost
    },
    getGhost: function() {
        return this.ghost
    },
    getProxy: function() {
        return this.proxy
    },
    hide: function() {
        if (this.ghost) {
            if (this.proxy) {
                this.proxy.remove();
                delete this.proxy
            }
            this.panel.el.dom.style.display = "";
            this.ghost.remove();
            delete this.ghost
        }
    },
    show: function() {
        if (!this.ghost) {
            this.ghost = this.panel.createGhost(undefined, undefined, Ext.getBody());
            this.ghost.setXY(this.panel.el.getXY());
            if (this.insertProxy) {
                this.proxy = this.panel.el.insertSibling({
                    cls: "x-panel-dd-spacer"
                });
                this.proxy.setSize(this.panel.getSize())
            }
            this.panel.el.dom.style.display = "none"
        }
    },
    repair: function(B, C, A) {
        this.hide();
        if (typeof C == "function") {
            C.call(A || this)
        }
    },
    moveProxy: function(A, B) {
        if (this.proxy) {
            A.insertBefore(this.proxy.dom, B)
        }
    }
};
Ext.Panel.DD = function(B, A) {
    this.panel = B;
    this.dragData = {
        panel: B
    };
    this.proxy = new Ext.dd.PanelProxy(B, A);
    Ext.Panel.DD.superclass.constructor.call(this, B.el, A);
    var C = B.header;
    if (C) {
        this.setHandleElId(C.id)
    } (C ? C: this.panel.body).setStyle("cursor", "move");
    this.scroll = false
};
Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, {
    showFrame: Ext.emptyFn,
    startDrag: Ext.emptyFn,
    b4StartDrag: function(A, B) {
        this.proxy.show()
    },
    b4MouseDown: function(B) {
        var A = B.getPageX();
        var C = B.getPageY();
        this.autoOffset(A, C)
    },
    onInitDrag: function(A, B) {
        this.onStartDrag(A, B);
        return true
    },
    createFrame: Ext.emptyFn,
    getDragEl: function(A) {
        return this.proxy.ghost.dom
    },
    endDrag: function(A) {
        this.proxy.hide();
        this.panel.saveState()
    },
    autoOffset: function(A, B) {
        A -= this.startPageX;
        B -= this.startPageY;
        this.setDelta(A, B)
    }
});
Ext.state.Provider = function() {
    this.addEvents("statechange");
    this.state = {};
    Ext.state.Provider.superclass.constructor.call(this)
};
Ext.extend(Ext.state.Provider, Ext.util.Observable, {
    get: function(B, A) {
        return typeof this.state[B] == "undefined" ? A: this.state[B]
    },
    clear: function(A) {
        delete this.state[A];
        this.fireEvent("statechange", this, A, null)
    },
    set: function(A, B) {
        this.state[A] = B;
        this.fireEvent("statechange", this, A, B)
    },
    decodeValue: function(A) {
        var J = /^(a|n|d|b|s|o)\:(.*)$/;
        var C = J.exec(unescape(A));
        if (!C || !C[1]) {
            return
        }
        var F = C[1];
        var H = C[2];
        switch (F) {
        case "n":
            return parseFloat(H);
        case "d":
            return new Date(Date.parse(H));
        case "b":
            return (H == "1");
        case "a":
            var G = [];
            var I = H.split("^");
            for (var B = 0, D = I.length; B < D; B++) {
                G.push(this.decodeValue(I[B]))
            }
            return G;
        case "o":
            var G = {};
            var I = H.split("^");
            for (var B = 0, D = I.length; B < D; B++) {
                var E = I[B].split("=");
                G[E[0]] = this.decodeValue(E[1])
            }
            return G;
        default:
            return H
        }
    },
    encodeValue: function(C) {
        var B;
        if (typeof C == "number") {
            B = "n:" + C
        } else {
            if (typeof C == "boolean") {
                B = "b:" + (C ? "1": "0")
            } else {
                if (Ext.isDate(C)) {
                    B = "d:" + C.toGMTString()
                } else {
                    if (Ext.isArray(C)) {
                        var F = "";
                        for (var E = 0, A = C.length; E < A; E++) {
                            F += this.encodeValue(C[E]);
                            if (E != A - 1) {
                                F += "^"
                            }
                        }
                        B = "a:" + F
                    } else {
                        if (typeof C == "object") {
                            var F = "";
                            for (var D in C) {
                                if (typeof C[D] != "function" && C[D] !== undefined) {
                                    F += D + "=" + this.encodeValue(C[D]) + "^"
                                }
                            }
                            B = "o:" + F.substring(0, F.length - 1)
                        } else {
                            B = "s:" + C
                        }
                    }
                }
            }
        }
        return escape(B)
    }
});
Ext.state.Manager = function() {
    var A = new Ext.state.Provider();
    return {
        setProvider: function(B) {
            A = B
        },
        get: function(C, B) {
            return A.get(C, B)
        },
        set: function(B, C) {
            A.set(B, C)
        },
        clear: function(B) {
            A.clear(B)
        },
        getProvider: function() {
            return A
        }
    }
} ();
Ext.state.CookieProvider = function(A) {
    Ext.state.CookieProvider.superclass.constructor.call(this);
    this.path = "/";
    this.expires = new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 7));
    this.domain = null;
    this.secure = false;
    Ext.apply(this, A);
    this.state = this.readCookies()
};
Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
    set: function(A, B) {
        if (typeof B == "undefined" || B === null) {
            this.clear(A);
            return
        }
        this.setCookie(A, B);
        Ext.state.CookieProvider.superclass.set.call(this, A, B)
    },
    clear: function(A) {
        this.clearCookie(A);
        Ext.state.CookieProvider.superclass.clear.call(this, A)
    },
    readCookies: function() {
        var C = {};
        var F = document.cookie + ";";
        var B = /\s?(.*?)=(.*?);/g;
        var E;
        while ((E = B.exec(F)) != null) {
            var A = E[1];
            var D = E[2];
            if (A && A.substring(0, 3) == "ys-") {
                C[A.substr(3)] = this.decodeValue(D)
            }
        }
        return C
    },
    setCookie: function(A, B) {
        document.cookie = "ys-" + A + "=" + this.encodeValue(B) + ((this.expires == null) ? "": ("; expires=" + this.expires.toGMTString())) + ((this.path == null) ? "": ("; path=" + this.path)) + ((this.domain == null) ? "": ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure": "")
    },
    clearCookie: function(A) {
        document.cookie = "ys-" + A + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + ((this.path == null) ? "": ("; path=" + this.path)) + ((this.domain == null) ? "": ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure": "")
    }
});
Ext.DataView = Ext.extend(Ext.BoxComponent, {
    selectedClass: "x-view-selected",
    emptyText: "",
    deferEmptyText: true,
    trackOver: false,
    last: false,
    initComponent: function() {
        Ext.DataView.superclass.initComponent.call(this);
        if (typeof this.tpl == "string") {
            this.tpl = new Ext.XTemplate(this.tpl)
        }
        this.addEvents("beforeclick", "click", "mouseenter", "mouseleave", "containerclick", "dblclick", "contextmenu", "selectionchange", "beforeselect");
        this.all = new Ext.CompositeElementLite();
        this.selected = new Ext.CompositeElementLite()
    },
    onRender: function() {
        if (!this.el) {
            this.el = document.createElement("div");
            this.el.id = this.id
        }
        Ext.DataView.superclass.onRender.apply(this, arguments)
    },
    afterRender: function() {
        Ext.DataView.superclass.afterRender.call(this);
        this.el.on({
            "click": this.onClick,
            "dblclick": this.onDblClick,
            "contextmenu": this.onContextMenu,
            scope: this
        });
        if (this.overClass || this.trackOver) {
            this.el.on({
                "mouseover": this.onMouseOver,
                "mouseout": this.onMouseOut,
                scope: this
            })
        }
        if (this.store) {
            this.setStore(this.store, true)
        }
    },
    refresh: function() {
        this.clearSelections(false, true);
        this.el.update("");
        var A = this.store.getRange();
        if (A.length < 1) {
            if (!this.deferEmptyText || this.hasSkippedEmptyText) {
                this.el.update(this.emptyText)
            }
            this.hasSkippedEmptyText = true;
            this.all.clear();
            return
        }
        this.tpl.overwrite(this.el, this.collectData(A, 0));
        this.all.fill(Ext.query(this.itemSelector, this.el.dom));
        this.updateIndexes(0)
    },
    prepareData: function(A) {
        return A
    },
    collectData: function(B, E) {
        var D = [];
        for (var C = 0, A = B.length; C < A; C++) {
            D[D.length] = this.prepareData(B[C].data, E + C, B[C])
        }
        return D
    },
    bufferRender: function(A) {
        var B = document.createElement("div");
        this.tpl.overwrite(B, this.collectData(A));
        return Ext.query(this.itemSelector, B)
    },
    onUpdate: function(F, A) {
        var B = this.store.indexOf(A);
        var E = this.isSelected(B);
        var C = this.all.elements[B];
        var D = this.bufferRender([A], B)[0];
        this.all.replaceElement(B, D, true);
        if (E) {
            this.selected.replaceElement(C, D);
            this.all.item(B).addClass(this.selectedClass)
        }
        this.updateIndexes(B, B)
    },
    onAdd: function(E, C, D) {
        if (this.all.getCount() == 0) {
            this.refresh();
            return
        }
        var B = this.bufferRender(C, D),
        F,
        A = this.all.elements;
        if (D < this.all.getCount()) {
            F = this.all.item(D).insertSibling(B, "before", true);
            A.splice.apply(A, [D, 0].concat(B))
        } else {
            F = this.all.last().insertSibling(B, "after", true);
            A.push.apply(A, B)
        }
        this.updateIndexes(D)
    },
    onRemove: function(C, A, B) {
        this.deselect(B);
        this.all.removeElement(B, true);
        this.updateIndexes(B)
    },
    refreshNode: function(A) {
        this.onUpdate(this.store, this.store.getAt(A))
    },
    updateIndexes: function(D, C) {
        var B = this.all.elements;
        D = D || 0;
        C = C || ((C === 0) ? 0 : (B.length - 1));
        for (var A = D; A <= C; A++) {
            B[A].viewIndex = A
        }
    },
    setStore: function(A, B) {
        if (!B && this.store) {
            this.store.un("beforeload", this.onBeforeLoad, this);
            this.store.un("datachanged", this.refresh, this);
            this.store.un("add", this.onAdd, this);
            this.store.un("remove", this.onRemove, this);
            this.store.un("update", this.onUpdate, this);
            this.store.un("clear", this.refresh, this)
        }
        if (A) {
            A = Ext.StoreMgr.lookup(A);
            A.on("beforeload", this.onBeforeLoad, this);
            A.on("datachanged", this.refresh, this);
            A.on("add", this.onAdd, this);
            A.on("remove", this.onRemove, this);
            A.on("update", this.onUpdate, this);
            A.on("clear", this.refresh, this)
        }
        this.store = A;
        if (A) {
            this.refresh()
        }
    },
    findItemFromChild: function(A) {
        return Ext.fly(A).findParent(this.itemSelector, this.el)
    },
    onClick: function(C) {
        var B = C.getTarget(this.itemSelector, this.el);
        if (B) {
            var A = this.indexOf(B);
            if (this.onItemClick(B, A, C) !== false) {
                this.fireEvent("click", this, A, B, C)
            }
        } else {
            if (this.fireEvent("containerclick", this, C) !== false) {
                this.clearSelections()
            }
        }
    },
    onContextMenu: function(B) {
        var A = B.getTarget(this.itemSelector, this.el);
        if (A) {
            this.fireEvent("contextmenu", this, this.indexOf(A), A, B)
        }
    },
    onDblClick: function(B) {
        var A = B.getTarget(this.itemSelector, this.el);
        if (A) {
            this.fireEvent("dblclick", this, this.indexOf(A), A, B)
        }
    },
    onMouseOver: function(B) {
        var A = B.getTarget(this.itemSelector, this.el);
        if (A && A !== this.lastItem) {
            this.lastItem = A;
            Ext.fly(A).addClass(this.overClass);
            this.fireEvent("mouseenter", this, this.indexOf(A), A, B)
        }
    },
    onMouseOut: function(A) {
        if (this.lastItem) {
            if (!A.within(this.lastItem, true)) {
                Ext.fly(this.lastItem).removeClass(this.overClass);
                this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, A);
                delete this.lastItem
            }
        }
    },
    onItemClick: function(B, A, C) {
        if (this.fireEvent("beforeclick", this, A, B, C) === false) {
            return false
        }
        if (this.multiSelect) {
            this.doMultiSelection(B, A, C);
            C.preventDefault()
        } else {
            if (this.singleSelect) {
                this.doSingleSelection(B, A, C);
                C.preventDefault()
            }
        }
        return true
    },
    doSingleSelection: function(B, A, C) {
        if (C.ctrlKey && this.isSelected(A)) {
            this.deselect(A)
        } else {
            this.select(A, false)
        }
    },
    doMultiSelection: function(C, A, D) {
        if (D.shiftKey && this.last !== false) {
            var B = this.last;
            this.selectRange(B, A, D.ctrlKey);
            this.last = B
        } else {
            if ((D.ctrlKey || this.simpleSelect) && this.isSelected(A)) {
                this.deselect(A)
            } else {
                this.select(A, D.ctrlKey || D.shiftKey || this.simpleSelect)
            }
        }
    },
    getSelectionCount: function() {
        return this.selected.getCount()
    },
    getSelectedNodes: function() {
        return this.selected.elements
    },
    getSelectedIndexes: function() {
        var B = [],
        D = this.selected.elements;
        for (var C = 0, A = D.length; C < A; C++) {
            B.push(D[C].viewIndex)
        }
        return B
    },
    getSelectedRecords: function() {
        var D = [],
        C = this.selected.elements;
        for (var B = 0, A = C.length; B < A; B++) {
            D[D.length] = this.store.getAt(C[B].viewIndex)
        }
        return D
    },
    getRecords: function(B) {
        var E = [],
        D = B;
        for (var C = 0, A = D.length; C < A; C++) {
            E[E.length] = this.store.getAt(D[C].viewIndex)
        }
        return E
    },
    getRecord: function(A) {
        return this.store.getAt(A.viewIndex)
    },
    clearSelections: function(A, B) {
        if ((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0) {
            if (!B) {
                this.selected.removeClass(this.selectedClass)
            }
            this.selected.clear();
            this.last = false;
            if (!A) {
                this.fireEvent("selectionchange", this, this.selected.elements)
            }
        }
    },
    isSelected: function(A) {
        return this.selected.contains(this.getNode(A))
    },
    deselect: function(A) {
        if (this.isSelected(A)) {
            A = this.getNode(A);
            this.selected.removeElement(A);
            if (this.last == A.viewIndex) {
                this.last = false
            }
            Ext.fly(A).removeClass(this.selectedClass);
            this.fireEvent("selectionchange", this, this.selected.elements)
        }
    },
    select: function(D, F, B) {
        if (Ext.isArray(D)) {
            if (!F) {
                this.clearSelections(true)
            }
            for (var C = 0, A = D.length; C < A; C++) {
                this.select(D[C], true, true)
            }
            if (!B) {
                this.fireEvent("selectionchange", this, this.selected.elements)
            }
        } else {
            var E = this.getNode(D);
            if (!F) {
                this.clearSelections(true)
            }
            if (E && !this.isSelected(E)) {
                if (this.fireEvent("beforeselect", this, E, this.selected.elements) !== false) {
                    Ext.fly(E).addClass(this.selectedClass);
                    this.selected.add(E);
                    this.last = E.viewIndex;
                    if (!B) {
                        this.fireEvent("selectionchange", this, this.selected.elements)
                    }
                }
            }
        }
    },
    selectRange: function(C, A, B) {
        if (!B) {
            this.clearSelections(true)
        }
        this.select(this.getNodes(C, A), true)
    },
    getNode: function(A) {
        if (typeof A == "string") {
            return document.getElementById(A)
        } else {
            if (typeof A == "number") {
                return this.all.elements[A]
            }
        }
        return A
    },
    getNodes: function(E, A) {
        var D = this.all.elements;
        E = E || 0;
        A = typeof A == "undefined" ? Math.max(D.length - 1, 0) : A;
        var B = [],
        C;
        if (E <= A) {
            for (C = E; C <= A && D[C]; C++) {
                B.push(D[C])
            }
        } else {
            for (C = E; C >= A && D[C]; C--) {
                B.push(D[C])
            }
        }
        return B
    },
    indexOf: function(A) {
        A = this.getNode(A);
        if (typeof A.viewIndex == "number") {
            return A.viewIndex
        }
        return this.all.indexOf(A)
    },
    onBeforeLoad: function() {
        if (this.loadingText) {
            this.clearSelections(false, true);
            this.el.update("<div class=\"loading-indicator\">" + this.loadingText + "</div>");
            this.all.clear()
        }
    },
    onDestroy: function() {
        Ext.DataView.superclass.onDestroy.call(this);
        this.setStore(null)
    }
});
Ext.reg("dataview", Ext.DataView);
Ext.ColorPalette = function(A) {
    Ext.ColorPalette.superclass.constructor.call(this, A);
    this.addEvents("select");
    if (this.handler) {
        this.on("select", this.handler, this.scope, true)
    }
};
Ext.extend(Ext.ColorPalette, Ext.Component, {
    itemCls: "x-color-palette",
    value: null,
    clickEvent: "click",
    ctype: "Ext.ColorPalette",
    allowReselect: false,
    colors: ["000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333", "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080", "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696", "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0", "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"],
    onRender: function(B, A) {
        var C = this.tpl || new Ext.XTemplate("<tpl for=\".\"><a href=\"#\" class=\"color-{.}\" hidefocus=\"on\"><em><span style=\"background:#{.}\" unselectable=\"on\">&#160;</span></em></a></tpl>");
        var D = document.createElement("div");
        D.className = this.itemCls;
        C.overwrite(D, this.colors);
        B.dom.insertBefore(D, A);
        this.el = Ext.get(D);
        this.el.on(this.clickEvent, this.handleClick, this, {
            delegate: "a"
        });
        if (this.clickEvent != "click") {
            this.el.on("click", Ext.emptyFn, this, {
                delegate: "a",
                preventDefault: true
            })
        }
    },
    afterRender: function() {
        Ext.ColorPalette.superclass.afterRender.call(this);
        if (this.value) {
            var A = this.value;
            this.value = null;
            this.select(A)
        }
    },
    handleClick: function(B, A) {
        B.preventDefault();
        if (!this.disabled) {
            var C = A.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
            this.select(C.toUpperCase())
        }
    },
    select: function(A) {
        A = A.replace("#", "");
        if (A != this.value || this.allowReselect) {
            var B = this.el;
            if (this.value) {
                B.child("a.color-" + this.value).removeClass("x-color-palette-sel")
            }
            B.child("a.color-" + A).addClass("x-color-palette-sel");
            this.value = A;
            this.fireEvent("select", this, A)
        }
    }
});
Ext.reg("colorpalette", Ext.ColorPalette);
Ext.DatePicker = Ext.extend(Ext.Component, {
    todayText: "Today",
    okText: "&#160;OK&#160;",
    cancelText: "Cancel",
    todayTip: "{0} (Spacebar)",
    minText: "This date is before the minimum date",
    maxText: "This date is after the maximum date",
    format: "m/d/y",
    disabledDaysText: "Disabled",
    disabledDatesText: "Disabled",
    constrainToViewport: true,
    monthNames: Date.monthNames,
    dayNames: Date.dayNames,
    nextText: "Next Month (Control+Right)",
    prevText: "Previous Month (Control+Left)",
    monthYearText: "Choose a month (Control+Up/Down to move years)",
    startDay: 0,
    showToday: true,
    initComponent: function() {
        Ext.DatePicker.superclass.initComponent.call(this);
        this.value = this.value ? this.value.clearTime() : new Date().clearTime();
        this.addEvents("select");
        if (this.handler) {
            this.on("select", this.handler, this.scope || this)
        }
        this.initDisabledDays()
    },
    initDisabledDays: function() {
        if (!this.disabledDatesRE && this.disabledDates) {
            var A = this.disabledDates;
            var C = "(?:";
            for (var B = 0; B < A.length; B++) {
                C += A[B];
                if (B != A.length - 1) {
                    C += "|"
                }
            }
            this.disabledDatesRE = new RegExp(C + ")")
        }
    },
    setDisabledDates: function(A) {
        if (Ext.isArray(A)) {
            this.disabledDates = A;
            this.disabledDatesRE = null
        } else {
            this.disabledDatesRE = A
        }
        this.initDisabledDays();
        this.update(this.value, true)
    },
    setDisabledDays: function(A) {
        this.disabledDays = A;
        this.update(this.value, true)
    },
    setMinDate: function(A) {
        this.minDate = A;
        this.update(this.value, true)
    },
    setMaxDate: function(A) {
        this.maxDate = A;
        this.update(this.value, true)
    },
    setValue: function(B) {
        var A = this.value;
        this.value = B.clearTime(true);
        if (this.el) {
            this.update(this.value)
        }
    },
    getValue: function() {
        return this.value
    },
    focus: function() {
        if (this.el) {
            this.update(this.activeDate)
        }
    },
    onRender: function(A, F) {
        var C = ["<table cellspacing=\"0\">", "<tr><td class=\"x-date-left\"><a href=\"#\" title=\"", this.prevText, "\">&#160;</a></td><td class=\"x-date-middle\" align=\"center\"></td><td class=\"x-date-right\"><a href=\"#\" title=\"", this.nextText, "\">&#160;</a></td></tr>", "<tr><td colspan=\"3\"><table class=\"x-date-inner\" cellspacing=\"0\"><thead><tr>"];
        var E = this.dayNames;
        for (var D = 0; D < 7; D++) {
            var G = this.startDay + D;
            if (G > 6) {
                G = G - 7
            }
            C.push("<th><span>", E[G].substr(0, 1), "</span></th>")
        }
        C[C.length] = "</tr></thead><tbody><tr>";
        for (var D = 0; D < 42; D++) {
            if (D % 7 == 0 && D != 0) {
                C[C.length] = "</tr><tr>"
            }
            C[C.length] = "<td><a href=\"#\" hidefocus=\"on\" class=\"x-date-date\" tabIndex=\"1\"><em><span></span></em></a></td>"
        }
        C.push("</tr></tbody></table></td></tr>", this.showToday ? "<tr><td colspan=\"3\" class=\"x-date-bottom\" align=\"center\"></td></tr>": "", "</table><div class=\"x-date-mp\"></div>");
        var B = document.createElement("div");
        B.className = "x-date-picker";
        B.innerHTML = C.join("");
        A.dom.insertBefore(B, F);
        this.el = Ext.get(B);
        this.eventEl = Ext.get(B.firstChild);
        new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {
            handler: this.showPrevMonth,
            scope: this,
            preventDefault: true,
            stopDefault: true
        });
        new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {
            handler: this.showNextMonth,
            scope: this,
            preventDefault: true,
            stopDefault: true
        });
        this.eventEl.on("mousewheel", this.handleMouseWheel, this);
        this.monthPicker = this.el.down("div.x-date-mp");
        this.monthPicker.enableDisplayMode("block");
        var I = new Ext.KeyNav(this.eventEl, {
            "left": function(J) {
                J.ctrlKey ? this.showPrevMonth() : this.update(this.activeDate.add("d", -1))
            },
            "right": function(J) {
                J.ctrlKey ? this.showNextMonth() : this.update(this.activeDate.add("d", 1))
            },
            "up": function(J) {
                J.ctrlKey ? this.showNextYear() : this.update(this.activeDate.add("d", -7))
            },
            "down": function(J) {
                J.ctrlKey ? this.showPrevYear() : this.update(this.activeDate.add("d", 7))
            },
            "pageUp": function(J) {
                this.showNextMonth()
            },
            "pageDown": function(J) {
                this.showPrevMonth()
            },
            "enter": function(J) {
                J.stopPropagation();
                return true
            },
            scope: this
        });
        this.eventEl.on("click", this.handleDateClick, this, {
            delegate: "a.x-date-date"
        });
        this.el.unselectable();
        this.cells = this.el.select("table.x-date-inner tbody td");
        this.textNodes = this.el.query("table.x-date-inner tbody span");
        this.mbtn = new Ext.Button({
            text: "&#160;",
            tooltip: this.monthYearText,
            renderTo: this.el.child("td.x-date-middle", true)
        });
        this.mbtn.on("click", this.showMonthPicker, this);
        this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");
        if (this.showToday) {
            this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this);
            var H = (new Date()).dateFormat(this.format);
            this.todayBtn = new Ext.Button({
                renderTo: this.el.child("td.x-date-bottom", true),
                text: String.format(this.todayText, H),
                tooltip: String.format(this.todayTip, H),
                handler: this.selectToday,
                scope: this
            })
        }
        if (Ext.isIE) {
            this.el.repaint()
        }
        this.update(this.value)
    },
    createMonthPicker: function() {
        if (!this.monthPicker.dom.firstChild) {
            var A = ["<table border=\"0\" cellspacing=\"0\">"];
            for (var B = 0; B < 6; B++) {
                A.push("<tr><td class=\"x-date-mp-month\"><a href=\"#\">", this.monthNames[B].substr(0, 3), "</a></td>", "<td class=\"x-date-mp-month x-date-mp-sep\"><a href=\"#\">", this.monthNames[B + 6].substr(0, 3), "</a></td>", B == 0 ? "<td class=\"x-date-mp-ybtn\" align=\"center\"><a class=\"x-date-mp-prev\"></a></td><td class=\"x-date-mp-ybtn\" align=\"center\"><a class=\"x-date-mp-next\"></a></td></tr>": "<td class=\"x-date-mp-year\"><a href=\"#\"></a></td><td class=\"x-date-mp-year\"><a href=\"#\"></a></td></tr>")
            }
            A.push("<tr class=\"x-date-mp-btns\"><td colspan=\"4\"><button type=\"button\" class=\"x-date-mp-ok\">", this.okText, "</button><button type=\"button\" class=\"x-date-mp-cancel\">", this.cancelText, "</button></td></tr>", "</table>");
            this.monthPicker.update(A.join(""));
            this.monthPicker.on("click", this.onMonthClick, this);
            this.monthPicker.on("dblclick", this.onMonthDblClick, this);
            this.mpMonths = this.monthPicker.select("td.x-date-mp-month");
            this.mpYears = this.monthPicker.select("td.x-date-mp-year");
            this.mpMonths.each(function(C, D, E) {
                E += 1;
                if ((E % 2) == 0) {
                    C.dom.xmonth = 5 + Math.round(E * 0.5)
                } else {
                    C.dom.xmonth = Math.round((E - 1) * 0.5)
                }
            })
        }
    },
    showMonthPicker: function() {
        this.createMonthPicker();
        var A = this.el.getSize();
        this.monthPicker.setSize(A);
        this.monthPicker.child("table").setSize(A);
        this.mpSelMonth = (this.activeDate || this.value).getMonth();
        this.updateMPMonth(this.mpSelMonth);
        this.mpSelYear = (this.activeDate || this.value).getFullYear();
        this.updateMPYear(this.mpSelYear);
        this.monthPicker.slideIn("t", {
            duration: 0.2
        })
    },
    updateMPYear: function(E) {
        this.mpyear = E;
        var C = this.mpYears.elements;
        for (var B = 1; B <= 10; B++) {
            var D = C[B - 1],
            A;
            if ((B % 2) == 0) {
                A = E + Math.round(B * 0.5);
                D.firstChild.innerHTML = A;
                D.xyear = A
            } else {
                A = E - (5 - Math.round(B * 0.5));
                D.firstChild.innerHTML = A;
                D.xyear = A
            }
            this.mpYears.item(B - 1)[A == this.mpSelYear ? "addClass": "removeClass"]("x-date-mp-sel")
        }
    },
    updateMPMonth: function(A) {
        this.mpMonths.each(function(B, C, D) {
            B[B.dom.xmonth == A ? "addClass": "removeClass"]("x-date-mp-sel")
        })
    },
    selectMPMonth: function(A) {},
    onMonthClick: function(D, B) {
        D.stopEvent();
        var C = new Ext.Element(B),
        A;
        if (C.is("button.x-date-mp-cancel")) {
            this.hideMonthPicker()
        } else {
            if (C.is("button.x-date-mp-ok")) {
                var E = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
                if (E.getMonth() != this.mpSelMonth) {
                    E = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth()
                }
                this.update(E);
                this.hideMonthPicker()
            } else {
                if (A = C.up("td.x-date-mp-month", 2)) {
                    this.mpMonths.removeClass("x-date-mp-sel");
                    A.addClass("x-date-mp-sel");
                    this.mpSelMonth = A.dom.xmonth
                } else {
                    if (A = C.up("td.x-date-mp-year", 2)) {
                        this.mpYears.removeClass("x-date-mp-sel");
                        A.addClass("x-date-mp-sel");
                        this.mpSelYear = A.dom.xyear
                    } else {
                        if (C.is("a.x-date-mp-prev")) {
                            this.updateMPYear(this.mpyear - 10)
                        } else {
                            if (C.is("a.x-date-mp-next")) {
                                this.updateMPYear(this.mpyear + 10)
                            }
                        }
                    }
                }
            }
        }
    },
    onMonthDblClick: function(D, B) {
        D.stopEvent();
        var C = new Ext.Element(B),
        A;
        if (A = C.up("td.x-date-mp-month", 2)) {
            this.update(new Date(this.mpSelYear, A.dom.xmonth, (this.activeDate || this.value).getDate()));
            this.hideMonthPicker()
        } else {
            if (A = C.up("td.x-date-mp-year", 2)) {
                this.update(new Date(A.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
                this.hideMonthPicker()
            }
        }
    },
    hideMonthPicker: function(A) {
        if (this.monthPicker) {
            if (A === true) {
                this.monthPicker.hide()
            } else {
                this.monthPicker.slideOut("t", {
                    duration: 0.2
                })
            }
        }
    },
    showPrevMonth: function(A) {
        this.update(this.activeDate.add("mo", -1))
    },
    showNextMonth: function(A) {
        this.update(this.activeDate.add("mo", 1))
    },
    showPrevYear: function() {
        this.update(this.activeDate.add("y", -1))
    },
    showNextYear: function() {
        this.update(this.activeDate.add("y", 1))
    },
    handleMouseWheel: function(A) {
        var B = A.getWheelDelta();
        if (B > 0) {
            this.showPrevMonth();
            A.stopEvent()
        } else {
            if (B < 0) {
                this.showNextMonth();
                A.stopEvent()
            }
        }
    },
    handleDateClick: function(B, A) {
        B.stopEvent();
        if (A.dateValue && !Ext.fly(A.parentNode).hasClass("x-date-disabled")) {
            this.setValue(new Date(A.dateValue));
            this.fireEvent("select", this, this.value)
        }
    },
    selectToday: function() {
        if (this.todayBtn && !this.todayBtn.disabled) {
            this.setValue(new Date().clearTime());
            this.fireEvent("select", this, this.value)
        }
    },
    update: function(a, U) {
        var A = this.activeDate;
        this.activeDate = a;
        if (!U && A && this.el) {
            var K = a.getTime();
            if (A.getMonth() == a.getMonth() && A.getFullYear() == a.getFullYear()) {
                this.cells.removeClass("x-date-selected");
                this.cells.each(function(d) {
                    if (d.dom.firstChild.dateValue == K) {
                        d.addClass("x-date-selected");
                        setTimeout(function() {
                            try {
                                d.dom.firstChild.focus()
                            } catch(f) {}
                        },
                        50);
                        return false
                    }
                });
                return
            }
        }
        var G = a.getDaysInMonth();
        var L = a.getFirstDateOfMonth();
        var D = L.getDay() - this.startDay;
        if (D <= this.startDay) {
            D += 7
        }
        var V = a.add("mo", -1);
        var E = V.getDaysInMonth() - D;
        var C = this.cells.elements;
        var M = this.textNodes;
        G += D;
        var R = 86400000;
        var X = (new Date(V.getFullYear(), V.getMonth(), E)).clearTime();
        var W = new Date().clearTime().getTime();
        var P = a.clearTime().getTime();
        var O = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY;
        var S = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY;
        var Z = this.disabledDatesRE;
        var N = this.disabledDatesText;
        var c = this.disabledDays ? this.disabledDays.join("") : false;
        var Y = this.disabledDaysText;
        var T = this.format;
        if (this.showToday) {
            var I = new Date().clearTime();
            var B = (I < O || I > S || (Z && T && Z.test(I.dateFormat(T))) || (c && c.indexOf(I.getDay()) != -1));
            this.todayBtn.setDisabled(B);
            this.todayKeyListener[B ? "disable": "enable"]()
        }
        var H = function(g, d) {
            d.title = "";
            var e = X.getTime();
            d.firstChild.dateValue = e;
            if (e == W) {
                d.className += " x-date-today";
                d.title = g.todayText
            }
            if (e == P) {
                d.className += " x-date-selected";
                setTimeout(function() {
                    try {
                        d.firstChild.focus()
                    } catch(h) {}
                },
                50)
            }
            if (e < O) {
                d.className = " x-date-disabled";
                d.title = g.minText;
                return
            }
            if (e > S) {
                d.className = " x-date-disabled";
                d.title = g.maxText;
                return
            }
            if (c) {
                if (c.indexOf(X.getDay()) != -1) {
                    d.title = Y;
                    d.className = " x-date-disabled"
                }
            }
            if (Z && T) {
                var f = X.dateFormat(T);
                if (Z.test(f)) {
                    d.title = N.replace("%0", f);
                    d.className = " x-date-disabled"
                }
            }
        };
        var Q = 0;
        for (; Q < D; Q++) {
            M[Q].innerHTML = (++E);
            X.setDate(X.getDate() + 1);
            C[Q].className = "x-date-prevday";
            H(this, C[Q])
        }
        for (; Q < G; Q++) {
            intDay = Q - D + 1;
            M[Q].innerHTML = (intDay);
            X.setDate(X.getDate() + 1);
            C[Q].className = "x-date-active";
            H(this, C[Q])
        }
        var b = 0;
        for (; Q < 42; Q++) {
            M[Q].innerHTML = (++b);
            X.setDate(X.getDate() + 1);
            C[Q].className = "x-date-nextday";
            H(this, C[Q])
        }
        this.mbtn.setText(this.monthNames[a.getMonth()] + " " + a.getFullYear());
        if (!this.internalRender) {
            var F = this.el.dom.firstChild;
            var J = F.offsetWidth;
            this.el.setWidth(J + this.el.getBorderWidth("lr"));
            Ext.fly(F).setWidth(J);
            this.internalRender = true;
            if (Ext.isOpera && !this.secondPass) {
                F.rows[0].cells[1].style.width = (J - (F.rows[0].cells[0].offsetWidth + F.rows[0].cells[2].offsetWidth)) + "px";
                this.secondPass = true;
                this.update.defer(10, this, [a])
            }
        }
    },
    beforeDestroy: function() {
        if (this.rendered) {
            Ext.destroy(this.mbtn, this.todayBtn)
        }
    }
});
Ext.reg("datepicker", Ext.DatePicker);
Ext.TabPanel = Ext.extend(Ext.Panel, {
    monitorResize: true,
    deferredRender: true,
    tabWidth: 120,
    minTabWidth: 30,
    resizeTabs: false,
    enableTabScroll: false,
    scrollIncrement: 0,
    scrollRepeatInterval: 400,
    scrollDuration: 0.35,
    animScroll: true,
    tabPosition: "top",
    baseCls: "x-tab-panel",
    autoTabs: false,
    autoTabSelector: "div.x-tab",
    activeTab: null,
    tabMargin: 2,
    plain: false,
    wheelIncrement: 20,
    idDelimiter: "__",
    itemCls: "x-tab-item",
    elements: "body",
    headerAsText: false,
    frame: false,
    hideBorders: true,
    initComponent: function() {
        this.frame = false;
        Ext.TabPanel.superclass.initComponent.call(this);
        this.addEvents("beforetabchange", "tabchange", "contextmenu");
        this.setLayout(new Ext.layout.CardLayout({
            deferredRender: this.deferredRender
        }));
        if (this.tabPosition == "top") {
            this.elements += ",header";
            this.stripTarget = "header"
        } else {
            this.elements += ",footer";
            this.stripTarget = "footer"
        }
        if (!this.stack) {
            this.stack = Ext.TabPanel.AccessStack()
        }
        this.initItems()
    },
    render: function() {
        Ext.TabPanel.superclass.render.apply(this, arguments);
        if (this.activeTab !== undefined) {
            var A = this.activeTab;
            delete this.activeTab;
            this.setActiveTab(A)
        }
    },
    onRender: function(C, A) {
        Ext.TabPanel.superclass.onRender.call(this, C, A);
        if (this.plain) {
            var F = this.tabPosition == "top" ? "header": "footer";
            this[F].addClass("x-tab-panel-" + F + "-plain")
        }
        var B = this[this.stripTarget];
        this.stripWrap = B.createChild({
            cls: "x-tab-strip-wrap",
            cn: {
                tag: "ul",
                cls: "x-tab-strip x-tab-strip-" + this.tabPosition
            }
        });
        var E = (this.tabPosition == "bottom" ? this.stripWrap: null);
        this.stripSpacer = B.createChild({
            cls: "x-tab-strip-spacer"
        },
        E);
        this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
        this.edge = this.strip.createChild({
            tag: "li",
            cls: "x-tab-edge"
        });
        this.strip.createChild({
            cls: "x-clear"
        });
        this.body.addClass("x-tab-panel-body-" + this.tabPosition);
        if (!this.itemTpl) {
            var D = new Ext.Template("<li class=\"{cls}\" id=\"{id}\"><a class=\"x-tab-strip-close\" onclick=\"return false;\"></a>", "<a class=\"x-tab-right\" href=\"#\" onclick=\"return false;\"><em class=\"x-tab-left\">", "<span class=\"x-tab-strip-inner\"><span class=\"x-tab-strip-text {iconCls}\">{text}</span></span>", "</em></a></li>");
            D.disableFormats = true;
            D.compile();
            Ext.TabPanel.prototype.itemTpl = D
        }
        this.items.each(this.initTab, this)
    },
    afterRender: function() {
        Ext.TabPanel.superclass.afterRender.call(this);
        if (this.autoTabs) {
            this.readTabs(false)
        }
    },
    initEvents: function() {
        Ext.TabPanel.superclass.initEvents.call(this);
        this.on("add", this.onAdd, this);
        this.on("remove", this.onRemove, this);
        this.strip.on("mousedown", this.onStripMouseDown, this);
        this.strip.on("contextmenu", this.onStripContextMenu, this);
        if (this.enableTabScroll) {
            this.strip.on("mousewheel", this.onWheel, this)
        }
    },
    findTargets: function(C) {
        var B = null;
        var A = C.getTarget("li", this.strip);
        if (A) {
            B = this.getComponent(A.id.split(this.idDelimiter)[1]);
            if (B.disabled) {
                return {
                    close: null,
                    item: null,
                    el: null
                }
            }
        }
        return {
            close: C.getTarget(".x-tab-strip-close", this.strip),
            item: B,
            el: A
        }
    },
    onStripMouseDown: function(B) {
        if (B.button != 0) {
            return
        }
        B.preventDefault();
        var A = this.findTargets(B);
        if (A.close) {
            this.remove(A.item);
            return
        }
        if (A.item && A.item != this.activeTab) {
            this.setActiveTab(A.item)
        }
    },
    onStripContextMenu: function(B) {
        B.preventDefault();
        var A = this.findTargets(B);
        if (A.item) {
            this.fireEvent("contextmenu", this, A.item, B)
        }
    },
    readTabs: function(D) {
        if (D === true) {
            this.items.each(function(G) {
                this.remove(G)
            },
            this)
        }
        var C = this.el.query(this.autoTabSelector);
        for (var B = 0, A = C.length; B < A; B++) {
            var E = C[B];
            var F = E.getAttribute("title");
            E.removeAttribute("title");
            this.add({
                title: F,
                el: E
            })
        }
    },
    initTab: function(D, B) {
        var E = this.strip.dom.childNodes[B];
        var A = D.closable ? "x-tab-strip-closable": "";
        if (D.disabled) {
            A += " x-item-disabled"
        }
        if (D.iconCls) {
            A += " x-tab-with-icon"
        }
        if (D.tabCls) {
            A += " " + D.tabCls
        }
        var F = {
            id: this.id + this.idDelimiter + D.getItemId(),
            text: D.title,
            cls: A,
            iconCls: D.iconCls || ""
        };
        var C = E ? this.itemTpl.insertBefore(E, F) : this.itemTpl.append(this.strip, F);
        Ext.fly(C).addClassOnOver("x-tab-strip-over");
        if (D.tabTip) {
            Ext.fly(C).child("span.x-tab-strip-text", true).qtip = D.tabTip
        }
        D.on("disable", this.onItemDisabled, this);
        D.on("enable", this.onItemEnabled, this);
        D.on("titlechange", this.onItemTitleChanged, this);
        D.on("beforeshow", this.onBeforeShowItem, this)
    },
    onAdd: function(C, B, A) {
        this.initTab(B, A);
        if (this.items.getCount() == 1) {
            this.syncSize()
        }
        this.delegateUpdates()
    },
    onBeforeAdd: function(B) {
        var A = B.events ? (this.items.containsKey(B.getItemId()) ? B: null) : this.items.get(B);
        if (A) {
            this.setActiveTab(B);
            return false
        }
        Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
        var C = B.elements;
        B.elements = C ? C.replace(",header", "") : C;
        B.border = (B.border === true)
    },
    onRemove: function(C, B) {
        Ext.removeNode(this.getTabEl(B));
        this.stack.remove(B);
        B.un("disable", this.onItemDisabled, this);
        B.un("enable", this.onItemEnabled, this);
        B.un("titlechange", this.onItemTitleChanged, this);
        B.un("beforeshow", this.onBeforeShowItem, this);
        if (B == this.activeTab) {
            var A = this.stack.next();
            if (A) {
                this.setActiveTab(A)
            } else {
                this.setActiveTab(0)
            }
        }
        this.delegateUpdates()
    },
    onBeforeShowItem: function(A) {
        if (A != this.activeTab) {
            this.setActiveTab(A);
            return false
        }
    },
    onItemDisabled: function(B) {
        var A = this.getTabEl(B);
        if (A) {
            Ext.fly(A).addClass("x-item-disabled")
        }
        this.stack.remove(B)
    },
    onItemEnabled: function(B) {
        var A = this.getTabEl(B);
        if (A) {
            Ext.fly(A).removeClass("x-item-disabled")
        }
    },
    onItemTitleChanged: function(B) {
        var A = this.getTabEl(B);
        if (A) {
            Ext.fly(A).child("span.x-tab-strip-text", true).innerHTML = B.title
        }
    },
    getTabEl: function(A) {
        var B = (typeof A === "number") ? this.items.items[A].getItemId() : A.getItemId();
        return document.getElementById(this.id + this.idDelimiter + B)
    },
    onResize: function() {
        Ext.TabPanel.superclass.onResize.apply(this, arguments);
        this.delegateUpdates()
    },
    beginUpdate: function() {
        this.suspendUpdates = true
    },
    endUpdate: function() {
        this.suspendUpdates = false;
        this.delegateUpdates()
    },
    hideTabStripItem: function(B) {
        B = this.getComponent(B);
        var A = this.getTabEl(B);
        if (A) {
            A.style.display = "none";
            this.delegateUpdates()
        }
        this.stack.remove(B)
    },
    unhideTabStripItem: function(B) {
        B = this.getComponent(B);
        var A = this.getTabEl(B);
        if (A) {
            A.style.display = "";
            this.delegateUpdates()
        }
    },
    delegateUpdates: function() {
        if (this.suspendUpdates) {
            return
        }
        if (this.resizeTabs && this.rendered) {
            this.autoSizeTabs()
        }
        if (this.enableTabScroll && this.rendered) {
            this.autoScrollTabs()
        }
    },
    autoSizeTabs: function() {
        var G = this.items.length;
        var B = this.tabPosition != "bottom" ? "header": "footer";
        var C = this[B].dom.offsetWidth;
        var A = this[B].dom.clientWidth;
        if (!this.resizeTabs || G < 1 || !A) {
            return
        }
        var I = Math.max(Math.min(Math.floor((A - 4) / G) - this.tabMargin, this.tabWidth), this.minTabWidth);
        this.lastTabWidth = I;
        var K = this.stripWrap.dom.getElementsByTagName("li");
        for (var E = 0, H = K.length - 1; E < H; E++) {
            var J = K[E];
            var L = J.childNodes[1].firstChild.firstChild;
            var F = J.offsetWidth;
            var D = L.offsetWidth;
            L.style.width = (I - (F - D)) + "px"
        }
    },
    adjustBodyWidth: function(A) {
        if (this.header) {
            this.header.setWidth(A)
        }
        if (this.footer) {
            this.footer.setWidth(A)
        }
        return A
    },
    setActiveTab: function(C) {
        C = this.getComponent(C);
        if (!C || this.fireEvent("beforetabchange", this, C, this.activeTab) === false) {
            return
        }
        if (!this.rendered) {
            this.activeTab = C;
            return
        }
        if (this.activeTab != C) {
            if (this.activeTab) {
                var A = this.getTabEl(this.activeTab);
                if (A) {
                    Ext.fly(A).removeClass("x-tab-strip-active")
                }
                this.activeTab.fireEvent("deactivate", this.activeTab)
            }
            var B = this.getTabEl(C);
            Ext.fly(B).addClass("x-tab-strip-active");
            this.activeTab = C;
            this.stack.add(C);
            this.layout.setActiveItem(C);
            if (this.layoutOnTabChange && C.doLayout) {
                C.doLayout()
            }
            if (this.scrolling) {
                this.scrollToTab(C, this.animScroll)
            }
            C.fireEvent("activate", C);
            this.fireEvent("tabchange", this, C)
        }
    },
    getActiveTab: function() {
        return this.activeTab || null
    },
    getItem: function(A) {
        return this.getComponent(A)
    },
    autoScrollTabs: function() {
        var G = this.items.length;
        var D = this.header.dom.offsetWidth;
        var C = this.header.dom.clientWidth;
        var F = this.stripWrap;
        var E = F.dom;
        var B = E.offsetWidth;
        var H = this.getScrollPos();
        var A = this.edge.getOffsetsTo(this.stripWrap)[0] + H;
        if (!this.enableTabScroll || G < 1 || B < 20) {
            return
        }
        if (A <= C) {
            E.scrollLeft = 0;
            F.setWidth(C);
            if (this.scrolling) {
                this.scrolling = false;
                this.header.removeClass("x-tab-scrolling");
                this.scrollLeft.hide();
                this.scrollRight.hide();
                if (Ext.isAir) {
                    E.style.marginLeft = "";
                    E.style.marginRight = ""
                }
            }
        } else {
            if (!this.scrolling) {
                this.header.addClass("x-tab-scrolling");
                if (Ext.isAir) {
                    E.style.marginLeft = "18px";
                    E.style.marginRight = "18px"
                }
            }
            C -= F.getMargins("lr");
            F.setWidth(C > 20 ? C: 20);
            if (!this.scrolling) {
                if (!this.scrollLeft) {
                    this.createScrollers()
                } else {
                    this.scrollLeft.show();
                    this.scrollRight.show()
                }
            }
            this.scrolling = true;
            if (H > (A - C)) {
                E.scrollLeft = A - C
            } else {
                this.scrollToTab(this.activeTab, false)
            }
            this.updateScrollButtons()
        }
    },
    createScrollers: function() {
        var C = this.stripWrap.dom.offsetHeight;
        var A = this.header.insertFirst({
            cls: "x-tab-scroller-left"
        });
        A.setHeight(C);
        A.addClassOnOver("x-tab-scroller-left-over");
        this.leftRepeater = new Ext.util.ClickRepeater(A, {
            interval: this.scrollRepeatInterval,
            handler: this.onScrollLeft,
            scope: this
        });
        this.scrollLeft = A;
        var B = this.header.insertFirst({
            cls: "x-tab-scroller-right"
        });
        B.setHeight(C);
        B.addClassOnOver("x-tab-scroller-right-over");
        this.rightRepeater = new Ext.util.ClickRepeater(B, {
            interval: this.scrollRepeatInterval,
            handler: this.onScrollRight,
            scope: this
        });
        this.scrollRight = B
    },
    getScrollWidth: function() {
        return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos()
    },
    getScrollPos: function() {
        return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0
    },
    getScrollArea: function() {
        return parseInt(this.stripWrap.dom.clientWidth, 10) || 0
    },
    getScrollAnim: function() {
        return {
            duration: this.scrollDuration,
            callback: this.updateScrollButtons,
            scope: this
        }
    },
    getScrollIncrement: function() {
        return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth + 2 : 100)
    },
    scrollToTab: function(E, A) {
        if (!E) {
            return
        }
        var C = this.getTabEl(E);
        var G = this.getScrollPos(),
        D = this.getScrollArea();
        var F = Ext.fly(C).getOffsetsTo(this.stripWrap)[0] + G;
        var B = F + C.offsetWidth;
        if (F < G) {
            this.scrollTo(F, A)
        } else {
            if (B > (G + D)) {
                this.scrollTo(B - D, A)
            }
        }
    },
    scrollTo: function(B, A) {
        this.stripWrap.scrollTo("left", B, A ? this.getScrollAnim() : false);
        if (!A) {
            this.updateScrollButtons()
        }
    },
    onWheel: function(D) {
        var E = D.getWheelDelta() * this.wheelIncrement * -1;
        D.stopEvent();
        var F = this.getScrollPos();
        var C = F + E;
        var A = this.getScrollWidth() - this.getScrollArea();
        var B = Math.max(0, Math.min(A, C));
        if (B != F) {
            this.scrollTo(B, false)
        }
    },
    onScrollRight: function() {
        var A = this.getScrollWidth() - this.getScrollArea();
        var C = this.getScrollPos();
        var B = Math.min(A, C + this.getScrollIncrement());
        if (B != C) {
            this.scrollTo(B, this.animScroll)
        }
    },
    onScrollLeft: function() {
        var B = this.getScrollPos();
        var A = Math.max(0, B - this.getScrollIncrement());
        if (A != B) {
            this.scrollTo(A, this.animScroll)
        }
    },
    updateScrollButtons: function() {
        var A = this.getScrollPos();
        this.scrollLeft[A == 0 ? "addClass": "removeClass"]("x-tab-scroller-left-disabled");
        this.scrollRight[A >= (this.getScrollWidth() - this.getScrollArea()) ? "addClass": "removeClass"]("x-tab-scroller-right-disabled")
    }
});
Ext.reg("tabpanel", Ext.TabPanel);
Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
Ext.TabPanel.AccessStack = function() {
    var A = [];
    return {
        add: function(B) {
            A.push(B);
            if (A.length > 10) {
                A.shift()
            }
        },
        remove: function(E) {
            var D = [];
            for (var C = 0, B = A.length; C < B; C++) {
                if (A[C] != E) {
                    D.push(A[C])
                }
            }
            A = D
        },
        next: function() {
            return A.pop()
        }
    }
};
Ext.Button = Ext.extend(Ext.Component, {
    hidden: false,
    disabled: false,
    pressed: false,
    enableToggle: false,
    menuAlign: "tl-bl?",
    type: "button",
    menuClassTarget: "tr",
    clickEvent: "click",
    handleMouseEvents: true,
    tooltipType: "qtip",
    buttonSelector: "button:first",
    initComponent: function() {
        Ext.Button.superclass.initComponent.call(this);
        this.addEvents("click", "toggle", "mouseover", "mouseout", "menushow", "menuhide", "menutriggerover", "menutriggerout");
        if (this.menu) {
            this.menu = Ext.menu.MenuMgr.get(this.menu)
        }
        if (typeof this.toggleGroup === "string") {
            this.enableToggle = true
        }
    },
    onRender: function(C, A) {
        if (!this.template) {
            if (!Ext.Button.buttonTemplate) {
                Ext.Button.buttonTemplate = new Ext.Template("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"x-btn-wrap\"><tbody><tr>", "<td class=\"x-btn-left\"><i>&#160;</i></td><td class=\"x-btn-center\"><em unselectable=\"on\"><button class=\"x-btn-text\" type=\"{1}\">{0}</button></em></td><td class=\"x-btn-right\"><i>&#160;</i></td>", "</tr></tbody></table>")
            }
            this.template = Ext.Button.buttonTemplate
        }
        var B, E = [this.text || "&#160;", this.type];
        if (A) {
            B = this.template.insertBefore(A, E, true)
        } else {
            B = this.template.append(C, E, true)
        }
        var D = B.child(this.buttonSelector);
        D.on("focus", this.onFocus, this);
        D.on("blur", this.onBlur, this);
        this.initButtonEl(B, D);
        if (this.menu) {
            this.el.child(this.menuClassTarget).addClass("x-btn-with-menu")
        }
        Ext.ButtonToggleMgr.register(this)
    },
    initButtonEl: function(B, C) {
        this.el = B;
        B.addClass("x-btn");
        if (this.icon) {
            C.setStyle("background-image", "url(" + this.icon + ")")
        }
        if (this.iconCls) {
            C.addClass(this.iconCls);
            if (!this.cls) {
                B.addClass(this.text ? "x-btn-text-icon": "x-btn-icon")
            }
        }
        if (this.tabIndex !== undefined) {
            C.dom.tabIndex = this.tabIndex
        }
        if (this.tooltip) {
            if (typeof this.tooltip == "object") {
                Ext.QuickTips.register(Ext.apply({
                    target: C.id
                },
                this.tooltip))
            } else {
                C.dom[this.tooltipType] = this.tooltip
            }
        }
        if (this.pressed) {
            this.el.addClass("x-btn-pressed")
        }
        if (this.handleMouseEvents) {
            B.on("mouseover", this.onMouseOver, this);
            B.on("mousedown", this.onMouseDown, this)
        }
        if (this.menu) {
            this.menu.on("show", this.onMenuShow, this);
            this.menu.on("hide", this.onMenuHide, this)
        }
        if (this.id) {
            this.el.dom.id = this.el.id = this.id
        }
        if (this.repeat) {
            var A = new Ext.util.ClickRepeater(B, typeof this.repeat == "object" ? this.repeat: {});
            A.on("click", this.onClick, this)
        }
        B.on(this.clickEvent, this.onClick, this)
    },
    afterRender: function() {
        Ext.Button.superclass.afterRender.call(this);
        if (Ext.isIE6) {
            this.autoWidth.defer(1, this)
        } else {
            this.autoWidth()
        }
    },
    setIconClass: function(A) {
        if (this.el) {
            this.el.child(this.buttonSelector).replaceClass(this.iconCls, A)
        }
        this.iconCls = A
    },
    beforeDestroy: function() {
        if (this.rendered) {
            var A = this.el.child(this.buttonSelector);
            if (A) {
                A.removeAllListeners()
            }
        }
        if (this.menu) {
            Ext.destroy(this.menu)
        }
    },
    onDestroy: function() {
        if (this.rendered) {
            Ext.ButtonToggleMgr.unregister(this)
        }
    },
    autoWidth: function() {
        if (this.el) {
            this.el.setWidth("auto");
            if (Ext.isIE7 && Ext.isStrict) {
                var A = this.el.child(this.buttonSelector);
                if (A && A.getWidth() > 20) {
                    A.clip();
                    A.setWidth(Ext.util.TextMetrics.measure(A, this.text).width + A.getFrameWidth("lr"))
                }
            }
            if (this.minWidth) {
                if (this.el.getWidth() < this.minWidth) {
                    this.el.setWidth(this.minWidth)
                }
            }
        }
    },
    setHandler: function(B, A) {
        this.handler = B;
        this.scope = A
    },
    setText: function(A) {
        this.text = A;
        if (this.el) {
            this.el.child("td.x-btn-center " + this.buttonSelector).update(A)
        }
        this.autoWidth()
    },
    getText: function() {
        return this.text
    },
    toggle: function(A) {
        A = A === undefined ? !this.pressed: A;
        if (A != this.pressed) {
            if (A) {
                this.el.addClass("x-btn-pressed");
                this.pressed = true;
                this.fireEvent("toggle", this, true)
            } else {
                this.el.removeClass("x-btn-pressed");
                this.pressed = false;
                this.fireEvent("toggle", this, false)
            }
            if (this.toggleHandler) {
                this.toggleHandler.call(this.scope || this, this, A)
            }
        }
    },
    focus: function() {
        this.el.child(this.buttonSelector).focus()
    },
    onDisable: function() {
        if (this.el) {
            if (!Ext.isIE6 || !this.text) {
                this.el.addClass(this.disabledClass)
            }
            this.el.dom.disabled = true
        }
        this.disabled = true
    },
    onEnable: function() {
        if (this.el) {
            if (!Ext.isIE6 || !this.text) {
                this.el.removeClass(this.disabledClass)
            }
            this.el.dom.disabled = false
        }
        this.disabled = false
    },
    showMenu: function() {
        if (this.menu) {
            this.menu.show(this.el, this.menuAlign)
        }
        return this
    },
    hideMenu: function() {
        if (this.menu) {
            this.menu.hide()
        }
        return this
    },
    hasVisibleMenu: function() {
        return this.menu && this.menu.isVisible()
    },
    onClick: function(A) {
        if (A) {
            A.preventDefault()
        }
        if (A.button != 0) {
            return
        }
        if (!this.disabled) {
            if (this.enableToggle && (this.allowDepress !== false || !this.pressed)) {
                this.toggle()
            }
            if (this.menu && !this.menu.isVisible() && !this.ignoreNextClick) {
                this.showMenu()
            }
            this.fireEvent("click", this, A);
            if (this.handler) {
                this.handler.call(this.scope || this, this, A)
            }
        }
    },
    isMenuTriggerOver: function(B, A) {
        return this.menu && !A
    },
    isMenuTriggerOut: function(B, A) {
        return this.menu && !A
    },
    onMouseOver: function(B) {
        if (!this.disabled) {
            var A = B.within(this.el, true);
            if (!A) {
                this.el.addClass("x-btn-over");
                if (!this.monitoringMouseOver) {
                    Ext.getDoc().on("mouseover", this.monitorMouseOver, this);
                    this.monitoringMouseOver = true
                }
                this.fireEvent("mouseover", this, B)
            }
            if (this.isMenuTriggerOver(B, A)) {
                this.fireEvent("menutriggerover", this, this.menu, B)
            }
        }
    },
    monitorMouseOver: function(A) {
        if (A.target != this.el.dom && !A.within(this.el)) {
            if (this.monitoringMouseOver) {
                Ext.getDoc().un("mouseover", this.monitorMouseOver, this);
                this.monitoringMouseOver = false
            }
            this.onMouseOut(A)
        }
    },
    onMouseOut: function(B) {
        var A = B.within(this.el) && B.target != this.el.dom;
        this.el.removeClass("x-btn-over");
        this.fireEvent("mouseout", this, B);
        if (this.isMenuTriggerOut(B, A)) {
            this.fireEvent("menutriggerout", this, this.menu, B)
        }
    },
    onFocus: function(A) {
        if (!this.disabled) {
            this.el.addClass("x-btn-focus")
        }
    },
    onBlur: function(A) {
        this.el.removeClass("x-btn-focus")
    },
    getClickEl: function(B, A) {
        return this.el
    },
    onMouseDown: function(A) {
        if (!this.disabled && A.button == 0) {
            this.getClickEl(A).addClass("x-btn-click");
            Ext.getDoc().on("mouseup", this.onMouseUp, this)
        }
    },
    onMouseUp: function(A) {
        if (A.button == 0) {
            this.getClickEl(A, true).removeClass("x-btn-click");
            Ext.getDoc().un("mouseup", this.onMouseUp, this)
        }
    },
    onMenuShow: function(A) {
        this.ignoreNextClick = 0;
        this.el.addClass("x-btn-menu-active");
        this.fireEvent("menushow", this, this.menu)
    },
    onMenuHide: function(A) {
        this.el.removeClass("x-btn-menu-active");
        this.ignoreNextClick = this.restoreClick.defer(250, this);
        this.fireEvent("menuhide", this, this.menu)
    },
    restoreClick: function() {
        this.ignoreNextClick = 0
    }
});
Ext.reg("button", Ext.Button);
Ext.ButtonToggleMgr = function() {
    var A = {};
    function B(E, G) {
        if (G) {
            var F = A[E.toggleGroup];
            for (var D = 0, C = F.length; D < C; D++) {
                if (F[D] != E) {
                    F[D].toggle(false)
                }
            }
        }
    }
    return {
        register: function(C) {
            if (!C.toggleGroup) {
                return
            }
            var D = A[C.toggleGroup];
            if (!D) {
                D = A[C.toggleGroup] = []
            }
            D.push(C);
            C.on("toggle", B)
        },
        unregister: function(C) {
            if (!C.toggleGroup) {
                return
            }
            var D = A[C.toggleGroup];
            if (D) {
                D.remove(C);
                C.un("toggle", B)
            }
        }
    }
} ();
Ext.SplitButton = Ext.extend(Ext.Button, {
    arrowSelector: "button:last",
    initComponent: function() {
        Ext.SplitButton.superclass.initComponent.call(this);
        this.addEvents("arrowclick")
    },
    onRender: function(D, A) {
        var B = new Ext.Template("<table cellspacing=\"0\" class=\"x-btn-menu-wrap x-btn\"><tr><td>", "<table cellspacing=\"0\" class=\"x-btn-wrap x-btn-menu-text-wrap\"><tbody>", "<tr><td class=\"x-btn-left\"><i>&#160;</i></td><td class=\"x-btn-center\"><button class=\"x-btn-text\" type=\"{1}\">{0}</button></td></tr>", "</tbody></table></td><td>", "<table cellspacing=\"0\" class=\"x-btn-wrap x-btn-menu-arrow-wrap\"><tbody>", "<tr><td class=\"x-btn-center\"><button class=\"x-btn-menu-arrow-el\" type=\"button\">&#160;</button></td><td class=\"x-btn-right\"><i>&#160;</i></td></tr>", "</tbody></table></td></tr></table>");
        var C, F = [this.text || "&#160;", this.type];
        if (A) {
            C = B.insertBefore(A, F, true)
        } else {
            C = B.append(D, F, true)
        }
        var E = C.child(this.buttonSelector);
        this.initButtonEl(C, E);
        this.arrowBtnTable = C.child("table:last");
        if (this.arrowTooltip) {
            C.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip
        }
    },
    autoWidth: function() {
        if (this.el) {
            var C = this.el.child("table:first");
            var B = this.el.child("table:last");
            this.el.setWidth("auto");
            C.setWidth("auto");
            if (Ext.isIE7 && Ext.isStrict) {
                var A = this.el.child(this.buttonSelector);
                if (A && A.getWidth() > 20) {
                    A.clip();
                    A.setWidth(Ext.util.TextMetrics.measure(A, this.text).width + A.getFrameWidth("lr"))
                }
            }
            if (this.minWidth) {
                if ((C.getWidth() + B.getWidth()) < this.minWidth) {
                    C.setWidth(this.minWidth - B.getWidth())
                }
            }
            this.el.setWidth(C.getWidth() + B.getWidth())
        }
    },
    setArrowHandler: function(B, A) {
        this.arrowHandler = B;
        this.scope = A
    },
    onClick: function(A) {
        A.preventDefault();
        if (!this.disabled) {
            if (A.getTarget(".x-btn-menu-arrow-wrap")) {
                if (this.menu && !this.menu.isVisible() && !this.ignoreNextClick) {
                    this.showMenu()
                }
                this.fireEvent("arrowclick", this, A);
                if (this.arrowHandler) {
                    this.arrowHandler.call(this.scope || this, this, A)
                }
            } else {
                if (this.enableToggle) {
                    this.toggle()
                }
                this.fireEvent("click", this, A);
                if (this.handler) {
                    this.handler.call(this.scope || this, this, A)
                }
            }
        }
    },
    getClickEl: function(B, A) {
        if (!A) {
            return (this.lastClickEl = B.getTarget("table", 10, true))
        }
        return this.lastClickEl
    },
    onDisable: function() {
        if (this.el) {
            if (!Ext.isIE6) {
                this.el.addClass("x-item-disabled")
            }
            this.el.child(this.buttonSelector).dom.disabled = true;
            this.el.child(this.arrowSelector).dom.disabled = true
        }
        this.disabled = true
    },
    onEnable: function() {
        if (this.el) {
            if (!Ext.isIE6) {
                this.el.removeClass("x-item-disabled")
            }
            this.el.child(this.buttonSelector).dom.disabled = false;
            this.el.child(this.arrowSelector).dom.disabled = false
        }
        this.disabled = false
    },
    isMenuTriggerOver: function(A) {
        return this.menu && A.within(this.arrowBtnTable) && !A.within(this.arrowBtnTable, true)
    },
    isMenuTriggerOut: function(B, A) {
        return this.menu && !B.within(this.arrowBtnTable)
    },
    onDestroy: function() {
        Ext.destroy(this.arrowBtnTable);
        Ext.SplitButton.superclass.onDestroy.call(this)
    }
});
Ext.MenuButton = Ext.SplitButton;
Ext.reg("splitbutton", Ext.SplitButton);
Ext.CycleButton = Ext.extend(Ext.SplitButton, {
    getItemText: function(A) {
        if (A && this.showText === true) {
            var B = "";
            if (this.prependText) {
                B += this.prependText
            }
            B += A.text;
            return B
        }
        return undefined
    },
    setActiveItem: function(C, A) {
        if (typeof C != "object") {
            C = this.menu.items.get(C)
        }
        if (C) {
            if (!this.rendered) {
                this.text = this.getItemText(C);
                this.iconCls = C.iconCls
            } else {
                var B = this.getItemText(C);
                if (B) {
                    this.setText(B)
                }
                this.setIconClass(C.iconCls)
            }
            this.activeItem = C;
            if (!C.checked) {
                C.setChecked(true, true)
            }
            if (this.forceIcon) {
                this.setIconClass(this.forceIcon)
            }
            if (!A) {
                this.fireEvent("change", this, C)
            }
        }
    },
    getActiveItem: function() {
        return this.activeItem
    },
    initComponent: function() {
        this.addEvents("change");
        if (this.changeHandler) {
            this.on("change", this.changeHandler, this.scope || this);
            delete this.changeHandler
        }
        this.itemCount = this.items.length;
        this.menu = {
            cls: "x-cycle-menu",
            items: []
        };
        var D;
        for (var B = 0, A = this.itemCount; B < A; B++) {
            var C = this.items[B];
            C.group = C.group || this.id;
            C.itemIndex = B;
            C.checkHandler = this.checkHandler;
            C.scope = this;
            C.checked = C.checked || false;
            this.menu.items.push(C);
            if (C.checked) {
                D = C
            }
        }
        this.setActiveItem(D, true);
        Ext.CycleButton.superclass.initComponent.call(this);
        this.on("click", this.toggleSelected, this)
    },
    checkHandler: function(A, B) {
        if (B) {
            this.setActiveItem(A)
        }
    },
    toggleSelected: function() {
        this.menu.render();
        var C, A;
        for (var B = 1; B < this.itemCount; B++) {
            C = (this.activeItem.itemIndex + B) % this.itemCount;
            A = this.menu.items.itemAt(C);
            if (!A.disabled) {
                A.setChecked(true);
                break
            }
        }
    }
});
Ext.reg("cycle", Ext.CycleButton);
Ext.Toolbar = function(A) {
    if (Ext.isArray(A)) {
        A = {
            buttons: A
        }
    }
    Ext.Toolbar.superclass.constructor.call(this, A)
};
(function() {
    var A = Ext.Toolbar;
    Ext.extend(A, Ext.BoxComponent, {
        trackMenus: true,
        initComponent: function() {
            A.superclass.initComponent.call(this);
            if (this.items) {
                this.buttons = this.items
            }
            this.items = new Ext.util.MixedCollection(false,
            function(B) {
                return B.itemId || B.id || Ext.id()
            })
        },
        autoCreate: {
            cls: "x-toolbar x-small-editor",
            html: "<table cellspacing=\"0\"><tr></tr></table>"
        },
        onRender: function(C, B) {
            this.el = C.createChild(Ext.apply({
                id: this.id
            },
            this.autoCreate), B);
            this.tr = this.el.child("tr", true)
        },
        afterRender: function() {
            A.superclass.afterRender.call(this);
            if (this.buttons) {
                this.add.apply(this, this.buttons);
                delete this.buttons
            }
        },
        add: function() {
            var C = arguments,
            B = C.length;
            for (var D = 0; D < B; D++) {
                var E = C[D];
                if (E.isFormField) {
                    this.addField(E)
                } else {
                    if (E.render) {
                        this.addItem(E)
                    } else {
                        if (typeof E == "string") {
                            if (E == "separator" || E == "-") {
                                this.addSeparator()
                            } else {
                                if (E == " ") {
                                    this.addSpacer()
                                } else {
                                    if (E == "->") {
                                        this.addFill()
                                    } else {
                                        this.addText(E)
                                    }
                                }
                            }
                        } else {
                            if (E.tagName) {
                                this.addElement(E)
                            } else {
                                if (typeof E == "object") {
                                    if (E.xtype) {
                                        this.addField(Ext.ComponentMgr.create(E, "button"))
                                    } else {
                                        this.addButton(E)
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        addSeparator: function() {
            return this.addItem(new A.Separator())
        },
        addSpacer: function() {
            return this.addItem(new A.Spacer())
        },
        addFill: function() {
            return this.addItem(new A.Fill())
        },
        addElement: function(B) {
            return this.addItem(new A.Item(B))
        },
        addItem: function(B) {
            var C = this.nextBlock();
            this.initMenuTracking(B);
            B.render(C);
            this.items.add(B);
            return B
        },
        addButton: function(D) {
            if (Ext.isArray(D)) {
                var F = [];
                for (var E = 0, C = D.length; E < C; E++) {
                    F.push(this.addButton(D[E]))
                }
                return F
            }
            var B = D;
            if (! (D instanceof A.Button)) {
                B = D.split ? new A.SplitButton(D) : new A.Button(D)
            }
            var G = this.nextBlock();
            this.initMenuTracking(B);
            B.render(G);
            this.items.add(B);
            return B
        },
        initMenuTracking: function(B) {
            if (this.trackMenus && B.menu) {
                B.on({
                    "menutriggerover": this.onButtonTriggerOver,
                    "menushow": this.onButtonMenuShow,
                    "menuhide": this.onButtonMenuHide,
                    scope: this
                })
            }
        },
        addText: function(B) {
            return this.addItem(new A.TextItem(B))
        },
        insertButton: function(C, F) {
            if (Ext.isArray(F)) {
                var E = [];
                for (var D = 0, B = F.length; D < B; D++) {
                    E.push(this.insertButton(C + D, F[D]))
                }
                return E
            }
            if (! (F instanceof A.Button)) {
                F = new A.Button(F)
            }
            var G = document.createElement("td");
            this.tr.insertBefore(G, this.tr.childNodes[C]);
            this.initMenuTracking(F);
            F.render(G);
            this.items.insert(C, F);
            return F
        },
        addDom: function(C, B) {
            var E = this.nextBlock();
            Ext.DomHelper.overwrite(E, C);
            var D = new A.Item(E.firstChild);
            D.render(E);
            this.items.add(D);
            return D
        },
        addField: function(C) {
            var D = this.nextBlock();
            C.render(D);
            var B = new A.Item(D.firstChild);
            B.render(D);
            this.items.add(C);
            return B
        },
        nextBlock: function() {
            var B = document.createElement("td");
            this.tr.appendChild(B);
            return B
        },
        onDestroy: function() {
            Ext.Toolbar.superclass.onDestroy.call(this);
            if (this.rendered) {
                if (this.items) {
                    Ext.destroy.apply(Ext, this.items.items)
                }
                Ext.Element.uncache(this.tr)
            }
        },
        onDisable: function() {
            this.items.each(function(B) {
                if (B.disable) {
                    B.disable()
                }
            })
        },
        onEnable: function() {
            this.items.each(function(B) {
                if (B.enable) {
                    B.enable()
                }
            })
        },
        onButtonTriggerOver: function(B) {
            if (this.activeMenuBtn && this.activeMenuBtn != B) {
                this.activeMenuBtn.hideMenu();
                B.showMenu();
                this.activeMenuBtn = B
            }
        },
        onButtonMenuShow: function(B) {
            this.activeMenuBtn = B
        },
        onButtonMenuHide: function(B) {
            delete this.activeMenuBtn
        }
    });
    Ext.reg("toolbar", Ext.Toolbar);
    A.Item = function(B) {
        this.el = Ext.getDom(B);
        this.id = Ext.id(this.el);
        this.hidden = false
    };
    A.Item.prototype = {
        getEl: function() {
            return this.el
        },
        render: function(B) {
            this.td = B;
            B.appendChild(this.el)
        },
        destroy: function() {
            if (this.td && this.td.parentNode) {
                this.td.parentNode.removeChild(this.td)
            }
        },
        show: function() {
            this.hidden = false;
            this.td.style.display = ""
        },
        hide: function() {
            this.hidden = true;
            this.td.style.display = "none"
        },
        setVisible: function(B) {
            if (B) {
                this.show()
            } else {
                this.hide()
            }
        },
        focus: function() {
            Ext.fly(this.el).focus()
        },
        disable: function() {
            Ext.fly(this.td).addClass("x-item-disabled");
            this.disabled = true;
            this.el.disabled = true
        },
        enable: function() {
            Ext.fly(this.td).removeClass("x-item-disabled");
            this.disabled = false;
            this.el.disabled = false
        }
    };
    Ext.reg("tbitem", A.Item);
    A.Separator = function() {
        var B = document.createElement("span");
        B.className = "ytb-sep";
        A.Separator.superclass.constructor.call(this, B)
    };
    Ext.extend(A.Separator, A.Item, {
        enable: Ext.emptyFn,
        disable: Ext.emptyFn,
        focus: Ext.emptyFn
    });
    Ext.reg("tbseparator", A.Separator);
    A.Spacer = function() {
        var B = document.createElement("div");
        B.className = "ytb-spacer";
        A.Spacer.superclass.constructor.call(this, B)
    };
    Ext.extend(A.Spacer, A.Item, {
        enable: Ext.emptyFn,
        disable: Ext.emptyFn,
        focus: Ext.emptyFn
    });
    Ext.reg("tbspacer", A.Spacer);
    A.Fill = Ext.extend(A.Spacer, {
        render: function(B) {
            B.style.width = "100%";
            A.Fill.superclass.render.call(this, B)
        }
    });
    Ext.reg("tbfill", A.Fill);
    A.TextItem = function(B) {
        var C = document.createElement("span");
        C.className = "ytb-text";
        C.innerHTML = B.text ? B.text: B;
        A.TextItem.superclass.constructor.call(this, C)
    };
    Ext.extend(A.TextItem, A.Item, {
        enable: Ext.emptyFn,
        disable: Ext.emptyFn,
        focus: Ext.emptyFn
    });
    Ext.reg("tbtext", A.TextItem);
    A.Button = Ext.extend(Ext.Button, {
        hideParent: true,
        onDestroy: function() {
            A.Button.superclass.onDestroy.call(this);
            if (this.container) {
                this.container.remove()
            }
        }
    });
    Ext.reg("tbbutton", A.Button);
    A.SplitButton = Ext.extend(Ext.SplitButton, {
        hideParent: true,
        onDestroy: function() {
            A.SplitButton.superclass.onDestroy.call(this);
            if (this.container) {
                this.container.remove()
            }
        }
    });
    Ext.reg("tbsplit", A.SplitButton);
    A.MenuButton = A.SplitButton
})();
Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {
    pageSize: 20,
    displayMsg: "Displaying {0} - {1} of {2}",
    emptyMsg: "No data to display",
    beforePageText: "Page",
    afterPageText: "of {0}",
    firstText: "First Page",
    prevText: "Previous Page",
    nextText: "Next Page",
    lastText: "Last Page",
    refreshText: "Refresh",
    paramNames: {
        start: "start",
        limit: "limit"
    },
    initComponent: function() {
        this.addEvents("change", "beforechange");
        Ext.PagingToolbar.superclass.initComponent.call(this);
        this.cursor = 0;
        this.bind(this.store)
    },
    onRender: function(B, A) {
        Ext.PagingToolbar.superclass.onRender.call(this, B, A);
        this.first = this.addButton({
            tooltip: this.firstText,
            iconCls: "x-tbar-page-first",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["first"])
        });
        this.prev = this.addButton({
            tooltip: this.prevText,
            iconCls: "x-tbar-page-prev",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["prev"])
        });
        this.addSeparator();
        this.add(this.beforePageText);
        this.field = Ext.get(this.addDom({
            tag: "input",
            type: "text",
            size: "3",
            value: "1",
            cls: "x-tbar-page-number",
            _isRendered: true
        }).el);
        this.field.on("keydown", this.onPagingKeydown, this);
        this.field.on("focus",
        function() {
            this.dom.select()
        });
        this.afterTextEl = this.addText(String.format(this.afterPageText, 1));
        this.field.setHeight(18);
        this.addSeparator();
        this.next = this.addButton({
            tooltip: this.nextText,
            iconCls: "x-tbar-page-next",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["next"])
        });
        this.last = this.addButton({
            tooltip: this.lastText,
            iconCls: "x-tbar-page-last",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["last"])
        });
        this.addSeparator();
        this.loading = this.addButton({
            tooltip: this.refreshText,
            iconCls: "x-tbar-loading",
            handler: this.onClick.createDelegate(this, ["refresh"])
        });
        if (this.displayInfo) {
            this.displayEl = Ext.fly(this.el.dom).createChild({
                cls: "x-paging-info"
            })
        }
        if (this.dsLoaded) {
            this.onLoad.apply(this, this.dsLoaded)
        }
    },
    updateInfo: function() {
        if (this.displayEl) {
            var A = this.store.getCount();
            var B = A == 0 ? this.emptyMsg: String.format(this.displayMsg, this.cursor + 1, this.cursor + A, this.store.getTotalCount());
            this.displayEl.update(B)
        }
    },
    onLoad: function(A, C, F) {
        if (!this.rendered) {
            this.dsLoaded = [A, C, F];
            return
        }
        this.cursor = F.params ? F.params[this.paramNames.start] : 0;
        var E = this.getPageData(),
        B = E.activePage,
        D = E.pages;
        this.afterTextEl.el.innerHTML = String.format(this.afterPageText, E.pages);
        this.field.dom.value = B;
        this.first.setDisabled(B == 1);
        this.prev.setDisabled(B == 1);
        this.next.setDisabled(B == D);
        this.last.setDisabled(B == D);
        this.loading.enable();
        this.updateInfo();
        this.fireEvent("change", this, E)
    },
    getPageData: function() {
        var A = this.store.getTotalCount();
        return {
            total: A,
            activePage: Math.ceil((this.cursor + this.pageSize) / this.pageSize),
            pages: A < this.pageSize ? 1 : Math.ceil(A / this.pageSize)
        }
    },
    onLoadError: function() {
        if (!this.rendered) {
            return
        }
        this.loading.enable()
    },
    readPage: function(C) {
        var A = this.field.dom.value,
        B;
        if (!A || isNaN(B = parseInt(A, 10))) {
            this.field.dom.value = C.activePage;
            return false
        }
        return B
    },
    onPagingKeydown: function(D) {
        var B = D.getKey(),
        E = this.getPageData(),
        C;
        if (B == D.RETURN) {
            D.stopEvent();
            C = this.readPage(E);
            if (C !== false) {
                C = Math.min(Math.max(1, C), E.pages) - 1;
                this.doLoad(C * this.pageSize)
            }
        } else {
            if (B == D.HOME || B == D.END) {
                D.stopEvent();
                C = B == D.HOME ? 1 : E.pages;
                this.field.dom.value = C
            } else {
                if (B == D.UP || B == D.PAGEUP || B == D.DOWN || B == D.PAGEDOWN) {
                    D.stopEvent();
                    if (C = this.readPage(E)) {
                        var A = D.shiftKey ? 10 : 1;
                        if (B == D.DOWN || B == D.PAGEDOWN) {
                            A *= -1
                        }
                        C += A;
                        if (C >= 1 & C <= E.pages) {
                            this.field.dom.value = C
                        }
                    }
                }
            }
        }
    },
    beforeLoad: function() {
        if (this.rendered && this.loading) {
            this.loading.disable()
        }
    },
    doLoad: function(C) {
        var B = {},
        A = this.paramNames;
        B[A.start] = C;
        B[A.limit] = this.pageSize;
        if (this.fireEvent("beforechange", this, B) !== false) {
            this.store.load({
                params: B
            })
        }
    },
    changePage: function(A) {
        this.doLoad(((A - 1) * this.pageSize).constrain(0, this.store.getTotalCount()))
    },
    onClick: function(E) {
        var B = this.store;
        switch (E) {
        case "first":
            this.doLoad(0);
            break;
        case "prev":
            this.doLoad(Math.max(0, this.cursor - this.pageSize));
            break;
        case "next":
            this.doLoad(this.cursor + this.pageSize);
            break;
        case "last":
            var D = B.getTotalCount();
            var A = D % this.pageSize;
            var C = A ? (D - A) : D - this.pageSize;
            this.doLoad(C);
            break;
        case "refresh":
            this.doLoad(this.cursor);
            break
        }
    },
    unbind: function(A) {
        A = Ext.StoreMgr.lookup(A);
        A.un("beforeload", this.beforeLoad, this);
        A.un("load", this.onLoad, this);
        A.un("loadexception", this.onLoadError, this);
        this.store = undefined
    },
    bind: function(A) {
        A = Ext.StoreMgr.lookup(A);
        A.on("beforeload", this.beforeLoad, this);
        A.on("load", this.onLoad, this);
        A.on("loadexception", this.onLoadError, this);
        this.store = A
    }
});
Ext.reg("paging", Ext.PagingToolbar);
Ext.Resizable = function(D, E) {
    this.el = Ext.get(D);
    if (E && E.wrap) {
        E.resizeChild = this.el;
        this.el = this.el.wrap(typeof E.wrap == "object" ? E.wrap: {
            cls: "xresizable-wrap"
        });
        this.el.id = this.el.dom.id = E.resizeChild.id + "-rzwrap";
        this.el.setStyle("overflow", "hidden");
        this.el.setPositioning(E.resizeChild.getPositioning());
        E.resizeChild.clearPositioning();
        if (!E.width || !E.height) {
            var F = E.resizeChild.getSize();
            this.el.setSize(F.width, F.height)
        }
        if (E.pinned && !E.adjustments) {
            E.adjustments = "auto"
        }
    }
    this.proxy = this.el.createProxy({
        tag: "div",
        cls: "x-resizable-proxy",
        id: this.el.id + "-rzproxy"
    },
    Ext.getBody());
    this.proxy.unselectable();
    this.proxy.enableDisplayMode("block");
    Ext.apply(this, E);
    if (this.pinned) {
        this.disableTrackOver = true;
        this.el.addClass("x-resizable-pinned")
    }
    var I = this.el.getStyle("position");
    if (I != "absolute" && I != "fixed") {
        this.el.setStyle("position", "relative")
    }
    if (!this.handles) {
        this.handles = "s,e,se";
        if (this.multiDirectional) {
            this.handles += ",n,w"
        }
    }
    if (this.handles == "all") {
        this.handles = "n s e w ne nw se sw"
    }
    var M = this.handles.split(/\s*?[,;]\s*?| /);
    var C = Ext.Resizable.positions;
    for (var H = 0, J = M.length; H < J; H++) {
        if (M[H] && C[M[H]]) {
            var L = C[M[H]];
            this[L] = new Ext.Resizable.Handle(this, L, this.disableTrackOver, this.transparent)
        }
    }
    this.corner = this.southeast;
    if (this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1) {
        this.updateBox = true
    }
    this.activeHandle = null;
    if (this.resizeChild) {
        if (typeof this.resizeChild == "boolean") {
            this.resizeChild = Ext.get(this.el.dom.firstChild, true)
        } else {
            this.resizeChild = Ext.get(this.resizeChild, true)
        }
    }
    if (this.adjustments == "auto") {
        var B = this.resizeChild;
        var K = this.west,
        G = this.east,
        A = this.north,
        M = this.south;
        if (B && (K || A)) {
            B.position("relative");
            B.setLeft(K ? K.el.getWidth() : 0);
            B.setTop(A ? A.el.getHeight() : 0)
        }
        this.adjustments = [(G ? -G.el.getWidth() : 0) + (K ? -K.el.getWidth() : 0), (A ? -A.el.getHeight() : 0) + (M ? -M.el.getHeight() : 0) - 1]
    }
    if (this.draggable) {
        this.dd = this.dynamic ? this.el.initDD(null) : this.el.initDDProxy(null, {
            dragElId: this.proxy.id
        });
        this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id: this.el.id)
    }
    this.addEvents("beforeresize", "resize");
    if (this.width !== null && this.height !== null) {
        this.resizeTo(this.width, this.height)
    } else {
        this.updateChildSize()
    }
    if (Ext.isIE) {
        this.el.dom.style.zoom = 1
    }
    Ext.Resizable.superclass.constructor.call(this)
};
Ext.extend(Ext.Resizable, Ext.util.Observable, {
    resizeChild: false,
    adjustments: [0, 0],
    minWidth: 5,
    minHeight: 5,
    maxWidth: 10000,
    maxHeight: 10000,
    enabled: true,
    animate: false,
    duration: 0.35,
    dynamic: false,
    handles: false,
    multiDirectional: false,
    disableTrackOver: false,
    easing: "easeOutStrong",
    widthIncrement: 0,
    heightIncrement: 0,
    pinned: false,
    width: null,
    height: null,
    preserveRatio: false,
    transparent: false,
    minX: 0,
    minY: 0,
    draggable: false,
    resizeTo: function(B, A) {
        this.el.setSize(B, A);
        this.updateChildSize();
        this.fireEvent("resize", this, B, A, null)
    },
    startSizing: function(C, B) {
        this.fireEvent("beforeresize", this, C);
        if (this.enabled) {
            if (!this.overlay) {
                this.overlay = this.el.createProxy({
                    tag: "div",
                    cls: "x-resizable-overlay",
                    html: "&#160;"
                },
                Ext.getBody());
                this.overlay.unselectable();
                this.overlay.enableDisplayMode("block");
                this.overlay.on("mousemove", this.onMouseMove, this);
                this.overlay.on("mouseup", this.onMouseUp, this)
            }
            this.overlay.setStyle("cursor", B.el.getStyle("cursor"));
            this.resizing = true;
            this.startBox = this.el.getBox();
            this.startPoint = C.getXY();
            this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0], (this.startBox.y + this.startBox.height) - this.startPoint[1]];
            this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
            this.overlay.show();
            if (this.constrainTo) {
                var A = Ext.get(this.constrainTo);
                this.resizeRegion = A.getRegion().adjust(A.getFrameWidth("t"), A.getFrameWidth("l"), -A.getFrameWidth("b"), -A.getFrameWidth("r"))
            }
            this.proxy.setStyle("visibility", "hidden");
            this.proxy.show();
            this.proxy.setBox(this.startBox);
            if (!this.dynamic) {
                this.proxy.setStyle("visibility", "visible")
            }
        }
    },
    onMouseDown: function(A, B) {
        if (this.enabled) {
            B.stopEvent();
            this.activeHandle = A;
            this.startSizing(B, A)
        }
    },
    onMouseUp: function(B) {
        var A = this.resizeElement();
        this.resizing = false;
        this.handleOut();
        this.overlay.hide();
        this.proxy.hide();
        this.fireEvent("resize", this, A.width, A.height, B)
    },
    updateChildSize: function() {
        if (this.resizeChild) {
            var C = this.el;
            var D = this.resizeChild;
            var B = this.adjustments;
            if (C.dom.offsetWidth) {
                var A = C.getSize(true);
                D.setSize(A.width + B[0], A.height + B[1])
            }
            if (Ext.isIE) {
                setTimeout(function() {
                    if (C.dom.offsetWidth) {
                        var E = C.getSize(true);
                        D.setSize(E.width + B[0], E.height + B[1])
                    }
                },
                10)
            }
        }
    },
    snap: function(C, E, B) {
        if (!E || !C) {
            return C
        }
        var D = C;
        var A = C % E;
        if (A > 0) {
            if (A > (E / 2)) {
                D = C + (E - A)
            } else {
                D = C - A
            }
        }
        return Math.max(B, D)
    },
    resizeElement: function() {
        var A = this.proxy.getBox();
        if (this.updateBox) {
            this.el.setBox(A, false, this.animate, this.duration, null, this.easing)
        } else {
            this.el.setSize(A.width, A.height, this.animate, this.duration, null, this.easing)
        }
        this.updateChildSize();
        if (!this.dynamic) {
            this.proxy.hide()
        }
        return A
    },
    constrain: function(B, C, A, D) {
        if (B - C < A) {
            C = B - A
        } else {
            if (B - C > D) {
                C = D - B
            }
        }
        return C
    },
    onMouseMove: function(S) {
        if (this.enabled) {
            try {
                if (this.resizeRegion && !this.resizeRegion.contains(S.getPoint())) {
                    return
                }
                var Q = this.curSize || this.startBox;
                var I = this.startBox.x,
                H = this.startBox.y;
                var C = I,
                B = H;
                var J = Q.width,
                R = Q.height;
                var D = J,
                L = R;
                var K = this.minWidth,
                T = this.minHeight;
                var P = this.maxWidth,
                W = this.maxHeight;
                var F = this.widthIncrement;
                var A = this.heightIncrement;
                var U = S.getXY();
                var O = -(this.startPoint[0] - Math.max(this.minX, U[0]));
                var M = -(this.startPoint[1] - Math.max(this.minY, U[1]));
                var G = this.activeHandle.position;
                switch (G) {
                case "east":
                    J += O;
                    J = Math.min(Math.max(K, J), P);
                    break;
                case "south":
                    R += M;
                    R = Math.min(Math.max(T, R), W);
                    break;
                case "southeast":
                    J += O;
                    R += M;
                    J = Math.min(Math.max(K, J), P);
                    R = Math.min(Math.max(T, R), W);
                    break;
                case "north":
                    M = this.constrain(R, M, T, W);
                    H += M;
                    R -= M;
                    break;
                case "west":
                    O = this.constrain(J, O, K, P);
                    I += O;
                    J -= O;
                    break;
                case "northeast":
                    J += O;
                    J = Math.min(Math.max(K, J), P);
                    M = this.constrain(R, M, T, W);
                    H += M;
                    R -= M;
                    break;
                case "northwest":
                    O = this.constrain(J, O, K, P);
                    M = this.constrain(R, M, T, W);
                    H += M;
                    R -= M;
                    I += O;
                    J -= O;
                    break;
                case "southwest":
                    O = this.constrain(J, O, K, P);
                    R += M;
                    R = Math.min(Math.max(T, R), W);
                    I += O;
                    J -= O;
                    break
                }
                var N = this.snap(J, F, K);
                var V = this.snap(R, A, T);
                if (N != J || V != R) {
                    switch (G) {
                    case "northeast":
                        H -= V - R;
                        break;
                    case "north":
                        H -= V - R;
                        break;
                    case "southwest":
                        I -= N - J;
                        break;
                    case "west":
                        I -= N - J;
                        break;
                    case "northwest":
                        I -= N - J;
                        H -= V - R;
                        break
                    }
                    J = N;
                    R = V
                }
                if (this.preserveRatio) {
                    switch (G) {
                    case "southeast":
                    case "east":
                        R = L * (J / D);
                        R = Math.min(Math.max(T, R), W);
                        J = D * (R / L);
                        break;
                    case "south":
                        J = D * (R / L);
                        J = Math.min(Math.max(K, J), P);
                        R = L * (J / D);
                        break;
                    case "northeast":
                        J = D * (R / L);
                        J = Math.min(Math.max(K, J), P);
                        R = L * (J / D);
                        break;
                    case "north":
                        var X = J;
                        J = D * (R / L);
                        J = Math.min(Math.max(K, J), P);
                        R = L * (J / D);
                        I += (X - J) / 2;
                        break;
                    case "southwest":
                        R = L * (J / D);
                        R = Math.min(Math.max(T, R), W);
                        var X = J;
                        J = D * (R / L);
                        I += X - J;
                        break;
                    case "west":
                        var E = R;
                        R = L * (J / D);
                        R = Math.min(Math.max(T, R), W);
                        H += (E - R) / 2;
                        var X = J;
                        J = D * (R / L);
                        I += X - J;
                        break;
                    case "northwest":
                        var X = J;
                        var E = R;
                        R = L * (J / D);
                        R = Math.min(Math.max(T, R), W);
                        J = D * (R / L);
                        H += E - R;
                        I += X - J;
                        break
                    }
                }
                this.proxy.setBounds(I, H, J, R);
                if (this.dynamic) {
                    this.resizeElement()
                }
            } catch(S) {}
        }
    },
    handleOver: function() {
        if (this.enabled) {
            this.el.addClass("x-resizable-over")
        }
    },
    handleOut: function() {
        if (!this.resizing) {
            this.el.removeClass("x-resizable-over")
        }
    },
    getEl: function() {
        return this.el
    },
    getResizeChild: function() {
        return this.resizeChild
    },
    destroy: function(C) {
        this.proxy.remove();
        if (this.overlay) {
            this.overlay.removeAllListeners();
            this.overlay.remove()
        }
        var D = Ext.Resizable.positions;
        for (var A in D) {
            if (typeof D[A] != "function" && this[D[A]]) {
                var B = this[D[A]];
                B.el.removeAllListeners();
                B.el.remove()
            }
        }
        if (C) {
            this.el.update("");
            this.el.remove()
        }
    },
    syncHandleHeight: function() {
        var A = this.el.getHeight(true);
        if (this.west) {
            this.west.el.setHeight(A)
        }
        if (this.east) {
            this.east.el.setHeight(A)
        }
    }
});
Ext.Resizable.positions = {
    n: "north",
    s: "south",
    e: "east",
    w: "west",
    se: "southeast",
    sw: "southwest",
    nw: "northwest",
    ne: "northeast"
};
Ext.Resizable.Handle = function(C, E, B, D) {
    if (!this.tpl) {
        var A = Ext.DomHelper.createTemplate({
            tag: "div",
            cls: "x-resizable-handle x-resizable-handle-{0}"
        });
        A.compile();
        Ext.Resizable.Handle.prototype.tpl = A
    }
    this.position = E;
    this.rz = C;
    this.el = this.tpl.append(C.el.dom, [this.position], true);
    this.el.unselectable();
    if (D) {
        this.el.setOpacity(0)
    }
    this.el.on("mousedown", this.onMouseDown, this);
    if (!B) {
        this.el.on("mouseover", this.onMouseOver, this);
        this.el.on("mouseout", this.onMouseOut, this)
    }
};
Ext.Resizable.Handle.prototype = {
    afterResize: function(A) {},
    onMouseDown: function(A) {
        this.rz.onMouseDown(this, A)
    },
    onMouseOver: function(A) {
        this.rz.handleOver(this, A)
    },
    onMouseOut: function(A) {
        this.rz.handleOut(this, A)
    }
};
Ext.Editor = function(B, A) {
    this.field = B;
    Ext.Editor.superclass.constructor.call(this, A)
};
Ext.extend(Ext.Editor, Ext.Component, {
    value: "",
    alignment: "c-c?",
    shadow: "frame",
    constrain: false,
    swallowKeys: true,
    completeOnEnter: false,
    cancelOnEsc: false,
    updateEl: false,
    initComponent: function() {
        Ext.Editor.superclass.initComponent.call(this);
        this.addEvents("beforestartedit", "startedit", "beforecomplete", "complete", "canceledit", "specialkey")
    },
    onRender: function(B, A) {
        this.el = new Ext.Layer({
            shadow: this.shadow,
            cls: "x-editor",
            parentEl: B,
            shim: this.shim,
            shadowOffset: 4,
            id: this.id,
            constrain: this.constrain
        });
        this.el.setStyle("overflow", Ext.isGecko ? "auto": "hidden");
        if (this.field.msgTarget != "title") {
            this.field.msgTarget = "qtip"
        }
        this.field.inEditor = true;
        this.field.render(this.el);
        if (Ext.isGecko) {
            this.field.el.dom.setAttribute("autocomplete", "off")
        }
        this.field.on("specialkey", this.onSpecialKey, this);
        if (this.swallowKeys) {
            this.field.el.swallowEvent(["keydown", "keypress"])
        }
        this.field.show();
        this.field.on("blur", this.onBlur, this);
        if (this.field.grow) {
            this.field.on("autosize", this.el.sync, this.el, {
                delay: 1
            })
        }
    },
    onSpecialKey: function(C, B) {
        var A = B.getKey();
        if (this.completeOnEnter && A == B.ENTER) {
            B.stopEvent();
            this.completeEdit()
        } else {
            if (this.cancelOnEsc && A == B.ESC) {
                this.cancelEdit()
            } else {
                this.fireEvent("specialkey", C, B)
            }
        }
        if (this.field.triggerBlur && (A == B.ENTER || A == B.ESC || A == B.TAB)) {
            this.field.triggerBlur()
        }
    },
    startEdit: function(B, C) {
        if (this.editing) {
            this.completeEdit()
        }
        this.boundEl = Ext.get(B);
        var A = C !== undefined ? C: this.boundEl.dom.innerHTML;
        if (!this.rendered) {
            this.render(this.parentEl || document.body)
        }
        if (this.fireEvent("beforestartedit", this, this.boundEl, A) === false) {
            return
        }
        this.startValue = A;
        this.field.setValue(A);
        this.doAutoSize();
        this.el.alignTo(this.boundEl, this.alignment);
        this.editing = true;
        this.show()
    },
    doAutoSize: function() {
        if (this.autoSize) {
            var A = this.boundEl.getSize();
            switch (this.autoSize) {
            case "width":
                this.setSize(A.width, "");
                break;
            case "height":
                this.setSize("", A.height);
                break;
            default:
                this.setSize(A.width, A.height)
            }
        }
    },
    setSize: function(A, B) {
        delete this.field.lastSize;
        this.field.setSize(A, B);
        if (this.el) {
            if (Ext.isGecko2 || Ext.isOpera) {
                this.el.setSize(A, B)
            }
            this.el.sync()
        }
    },
    realign: function() {
        this.el.alignTo(this.boundEl, this.alignment)
    },
    completeEdit: function(A) {
        if (!this.editing) {
            return
        }
        var B = this.getValue();
        if (this.revertInvalid !== false && !this.field.isValid()) {
            B = this.startValue;
            this.cancelEdit(true)
        }
        if (String(B) === String(this.startValue) && this.ignoreNoChange) {
            this.editing = false;
            this.hide();
            return
        }
        if (this.fireEvent("beforecomplete", this, B, this.startValue) !== false) {
            this.editing = false;
            if (this.updateEl && this.boundEl) {
                this.boundEl.update(B)
            }
            if (A !== true) {
                this.hide()
            }
            this.fireEvent("complete", this, B, this.startValue)
        }
    },
    onShow: function() {
        this.el.show();
        if (this.hideEl !== false) {
            this.boundEl.hide()
        }
        this.field.show();
        if (Ext.isIE && !this.fixIEFocus) {
            this.fixIEFocus = true;
            this.deferredFocus.defer(50, this)
        } else {
            this.field.focus()
        }
        this.fireEvent("startedit", this.boundEl, this.startValue)
    },
    deferredFocus: function() {
        if (this.editing) {
            this.field.focus()
        }
    },
    cancelEdit: function(A) {
        if (this.editing) {
            var B = this.getValue();
            this.setValue(this.startValue);
            if (A !== true) {
                this.hide()
            }
            this.fireEvent("canceledit", this, B, this.startValue)
        }
    },
    onBlur: function() {
        if (this.allowBlur !== true && this.editing) {
            this.completeEdit()
        }
    },
    onHide: function() {
        if (this.editing) {
            this.completeEdit();
            return
        }
        this.field.blur();
        if (this.field.collapse) {
            this.field.collapse()
        }
        this.el.hide();
        if (this.hideEl !== false) {
            this.boundEl.show()
        }
    },
    setValue: function(A) {
        this.field.setValue(A)
    },
    getValue: function() {
        return this.field.getValue()
    },
    beforeDestroy: function() {
        this.field.destroy();
        this.field = null
    }
});
Ext.reg("editor", Ext.Editor);
Ext.MessageBox = function() {
    var R, B, N, Q;
    var G, J, P, A, K, M, H, F;
    var O, S, L, C = "";
    var D = function(U) {
        if (R.isVisible()) {
            R.hide();
            Ext.callback(B.fn, B.scope || window, [U, S.dom.value], 1)
        }
    };
    var T = function() {
        if (B && B.cls) {
            R.el.removeClass(B.cls)
        }
        K.reset()
    };
    var E = function(W, U, V) {
        if (B && B.closable !== false) {
            R.hide()
        }
        if (V) {
            V.stopEvent()
        }
    };
    var I = function(U) {
        var W = 0;
        if (!U) {
            O["ok"].hide();
            O["cancel"].hide();
            O["yes"].hide();
            O["no"].hide();
            return W
        }
        R.footer.dom.style.display = "";
        for (var V in O) {
            if (typeof O[V] != "function") {
                if (U[V]) {
                    O[V].show();
                    O[V].setText(typeof U[V] == "string" ? U[V] : Ext.MessageBox.buttonText[V]);
                    W += O[V].el.getWidth() + 15
                } else {
                    O[V].hide()
                }
            }
        }
        return W
    };
    return {
        getDialog: function(U) {
            if (!R) {
                R = new Ext.Window({
                    autoCreate: true,
                    title: U,
                    resizable: false,
                    constrain: true,
                    constrainHeader: true,
                    minimizable: false,
                    maximizable: false,
                    stateful: false,
                    modal: true,
                    shim: true,
                    buttonAlign: "center",
                    width: 400,
                    height: 100,
                    minHeight: 80,
                    plain: true,
                    footer: true,
                    closable: true,
                    close: function() {
                        if (B && B.buttons && B.buttons.no && !B.buttons.cancel) {
                            D("no")
                        } else {
                            D("cancel")
                        }
                    }
                });
                O = {};
                var V = this.buttonText;
                O["ok"] = R.addButton(V["ok"], D.createCallback("ok"));
                O["yes"] = R.addButton(V["yes"], D.createCallback("yes"));
                O["no"] = R.addButton(V["no"], D.createCallback("no"));
                O["cancel"] = R.addButton(V["cancel"], D.createCallback("cancel"));
                O["ok"].hideMode = O["yes"].hideMode = O["no"].hideMode = O["cancel"].hideMode = "offsets";
                R.render(document.body);
                R.getEl().addClass("x-window-dlg");
                N = R.mask;
                G = R.body.createChild({
                    html: "<div class=\"ext-mb-icon\"></div><div class=\"ext-mb-content\"><span class=\"ext-mb-text\"></span><br /><div class=\"ext-mb-fix-cursor\"><input type=\"text\" class=\"ext-mb-input\" /><textarea class=\"ext-mb-textarea\"></textarea></div></div>"
                });
                H = Ext.get(G.dom.firstChild);
                var W = G.dom.childNodes[1];
                J = Ext.get(W.firstChild);
                P = Ext.get(W.childNodes[2].firstChild);
                P.enableDisplayMode();
                P.addKeyListener([10, 13],
                function() {
                    if (R.isVisible() && B && B.buttons) {
                        if (B.buttons.ok) {
                            D("ok")
                        } else {
                            if (B.buttons.yes) {
                                D("yes")
                            }
                        }
                    }
                });
                A = Ext.get(W.childNodes[2].childNodes[1]);
                A.enableDisplayMode();
                K = new Ext.ProgressBar({
                    renderTo: G
                });
                G.createChild({
                    cls: "x-clear"
                })
            }
            return R
        },
        updateText: function(X) {
            if (!R.isVisible() && !B.width) {
                R.setSize(this.maxWidth, 100)
            }
            J.update(X || "&#160;");
            var V = C != "" ? (H.getWidth() + H.getMargins("lr")) : 0;
            var Z = J.getWidth() + J.getMargins("lr");
            var W = R.getFrameWidth("lr");
            var Y = R.body.getFrameWidth("lr");
            if (Ext.isIE && V > 0) {
                V += 3
            }
            var U = Math.max(Math.min(B.width || V + Z + W + Y, this.maxWidth), Math.max(B.minWidth || this.minWidth, L || 0));
            if (B.prompt === true) {
                S.setWidth(U - V - W - Y)
            }
            if (B.progress === true || B.wait === true) {
                K.setSize(U - V - W - Y)
            }
            R.setSize(U, "auto").center();
            return this
        },
        updateProgress: function(V, U, W) {
            K.updateProgress(V, U);
            if (W) {
                this.updateText(W)
            }
            return this
        },
        isVisible: function() {
            return R && R.isVisible()
        },
        hide: function() {
            if (this.isVisible()) {
                R.hide();
                T()
            }
            return this
        },
        show: function(X) {
            if (this.isVisible()) {
                this.hide()
            }
            B = X;
            var Y = this.getDialog(B.title || "&#160;");
            Y.setTitle(B.title || "&#160;");
            var U = (B.closable !== false && B.progress !== true && B.wait !== true);
            Y.tools.close.setDisplayed(U);
            S = P;
            B.prompt = B.prompt || (B.multiline ? true: false);
            if (B.prompt) {
                if (B.multiline) {
                    P.hide();
                    A.show();
                    A.setHeight(typeof B.multiline == "number" ? B.multiline: this.defaultTextHeight);
                    S = A
                } else {
                    P.show();
                    A.hide()
                }
            } else {
                P.hide();
                A.hide()
            }
            S.dom.value = B.value || "";
            if (B.prompt) {
                Y.focusEl = S
            } else {
                var W = B.buttons;
                var V = null;
                if (W && W.ok) {
                    V = O["ok"]
                } else {
                    if (W && W.yes) {
                        V = O["yes"]
                    }
                }
                if (V) {
                    Y.focusEl = V
                }
            }
            if (B.iconCls) {
                Y.setIconClass(B.iconCls)
            }
            this.setIcon(B.icon);
            L = I(B.buttons);
            K.setVisible(B.progress === true || B.wait === true);
            this.updateProgress(0, B.progressText);
            this.updateText(B.msg);
            if (B.cls) {
                Y.el.addClass(B.cls)
            }
            Y.proxyDrag = B.proxyDrag === true;
            Y.modal = B.modal !== false;
            Y.mask = B.modal !== false ? N: false;
            if (!Y.isVisible()) {
                document.body.appendChild(R.el.dom);
                Y.setAnimateTarget(B.animEl);
                Y.show(B.animEl)
            }
            Y.on("show",
            function() {
                if (U === true) {
                    Y.keyMap.enable()
                } else {
                    Y.keyMap.disable()
                }
            },
            this, {
                single: true
            });
            if (B.wait === true) {
                K.wait(B.waitConfig)
            }
            return this
        },
        setIcon: function(U) {
            if (U && U != "") {
                H.removeClass("x-hidden");
                H.replaceClass(C, U);
                C = U
            } else {
                H.replaceClass(C, "x-hidden");
                C = ""
            }
            return this
        },
        progress: function(W, V, U) {
            this.show({
                title: W,
                msg: V,
                buttons: false,
                progress: true,
                closable: false,
                minWidth: this.minProgressWidth,
                progressText: U
            });
            return this
        },
        wait: function(W, V, U) {
            this.show({
                title: V,
                msg: W,
                buttons: false,
                closable: false,
                wait: true,
                modal: true,
                minWidth: this.minProgressWidth,
                waitConfig: U
            });
            return this
        },
        alert: function(X, W, V, U) {
            this.show({
                title: X,
                msg: W,
                buttons: this.OK,
                fn: V,
                scope: U
            });
            return this
        },
        confirm: function(X, W, V, U) {
            this.show({
                title: X,
                msg: W,
                buttons: this.YESNO,
                fn: V,
                scope: U,
                icon: this.QUESTION
            });
            return this
        },
        prompt: function(Z, Y, W, V, U, X) {
            this.show({
                title: Z,
                msg: Y,
                buttons: this.OKCANCEL,
                fn: W,
                minWidth: 250,
                scope: V,
                prompt: true,
                multiline: U,
                value: X
            });
            return this
        },
        OK: {
            ok: true
        },
        CANCEL: {
            cancel: true
        },
        OKCANCEL: {
            ok: true,
            cancel: true
        },
        YESNO: {
            yes: true,
            no: true
        },
        YESNOCANCEL: {
            yes: true,
            no: true,
            cancel: true
        },
        INFO: "ext-mb-info",
        WARNING: "ext-mb-warning",
        QUESTION: "ext-mb-question",
        ERROR: "ext-mb-error",
        defaultTextHeight: 75,
        maxWidth: 600,
        minWidth: 100,
        minProgressWidth: 250,
        buttonText: {
            ok: "OK",
            cancel: "Cancel",
            yes: "Yes",
            no: "No"
        }
    }
} ();
Ext.Msg = Ext.MessageBox;
Ext.Tip = Ext.extend(Ext.Panel, {
    minWidth: 40,
    maxWidth: 300,
    shadow: "sides",
    defaultAlign: "tl-bl?",
    autoRender: true,
    quickShowInterval: 250,
    frame: true,
    hidden: true,
    baseCls: "x-tip",
    floating: {
        shadow: true,
        shim: true,
        useDisplay: true,
        constrain: false
    },
    autoHeight: true,
    initComponent: function() {
        Ext.Tip.superclass.initComponent.call(this);
        if (this.closable && !this.title) {
            this.elements += ",header"
        }
    },
    afterRender: function() {
        Ext.Tip.superclass.afterRender.call(this);
        if (this.closable) {
            this.addTool({
                id: "close",
                handler: this.hide,
                scope: this
            })
        }
    },
    showAt: function(A) {
        Ext.Tip.superclass.show.call(this);
        if (this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != "number")) {
            this.doAutoWidth()
        }
        if (this.constrainPosition) {
            A = this.el.adjustForConstraints(A)
        }
        this.setPagePosition(A[0], A[1])
    },
    doAutoWidth: function() {
        var A = this.body.getTextWidth();
        if (this.title) {
            A = Math.max(A, this.header.child("span").getTextWidth(this.title))
        }
        A += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr");
        this.setWidth(A.constrain(this.minWidth, this.maxWidth));
        if (Ext.isIE7 && !this.repainted) {
            this.el.repaint();
            this.repainted = true
        }
    },
    showBy: function(A, B) {
        if (!this.rendered) {
            this.render(Ext.getBody())
        }
        this.showAt(this.el.getAlignToXY(A, B || this.defaultAlign))
    },
    initDraggable: function() {
        this.dd = new Ext.Tip.DD(this, typeof this.draggable == "boolean" ? null: this.draggable);
        this.header.addClass("x-tip-draggable")
    }
});
Ext.Tip.DD = function(B, A) {
    Ext.apply(this, A);
    this.tip = B;
    Ext.Tip.DD.superclass.constructor.call(this, B.el.id, "WindowDD-" + B.id);
    this.setHandleElId(B.header.id);
    this.scroll = false
};
Ext.extend(Ext.Tip.DD, Ext.dd.DD, {
    moveOnly: true,
    scroll: false,
    headerOffsets: [100, 25],
    startDrag: function() {
        this.tip.el.disableShadow()
    },
    endDrag: function(A) {
        this.tip.el.enableShadow(true)
    }
});
Ext.ToolTip = Ext.extend(Ext.Tip, {
    showDelay: 500,
    hideDelay: 200,
    dismissDelay: 5000,
    mouseOffset: [15, 18],
    trackMouse: false,
    constrainPosition: true,
    initComponent: function() {
        Ext.ToolTip.superclass.initComponent.call(this);
        this.lastActive = new Date();
        this.initTarget()
    },
    initTarget: function() {
        if (this.target) {
            this.target = Ext.get(this.target);
            this.target.on("mouseover", this.onTargetOver, this);
            this.target.on("mouseout", this.onTargetOut, this);
            this.target.on("mousemove", this.onMouseMove, this)
        }
    },
    onMouseMove: function(A) {
        this.targetXY = A.getXY();
        if (!this.hidden && this.trackMouse) {
            this.setPagePosition(this.getTargetXY())
        }
    },
    getTargetXY: function() {
        return [this.targetXY[0] + this.mouseOffset[0], this.targetXY[1] + this.mouseOffset[1]]
    },
    onTargetOver: function(A) {
        if (this.disabled || A.within(this.target.dom, true)) {
            return
        }
        this.clearTimer("hide");
        this.targetXY = A.getXY();
        this.delayShow()
    },
    delayShow: function() {
        if (this.hidden && !this.showTimer) {
            if (this.lastActive.getElapsed() < this.quickShowInterval) {
                this.show()
            } else {
                this.showTimer = this.show.defer(this.showDelay, this)
            }
        } else {
            if (!this.hidden && this.autoHide !== false) {
                this.show()
            }
        }
    },
    onTargetOut: function(A) {
        if (this.disabled || A.within(this.target.dom, true)) {
            return
        }
        this.clearTimer("show");
        if (this.autoHide !== false) {
            this.delayHide()
        }
    },
    delayHide: function() {
        if (!this.hidden && !this.hideTimer) {
            this.hideTimer = this.hide.defer(this.hideDelay, this)
        }
    },
    hide: function() {
        this.clearTimer("dismiss");
        this.lastActive = new Date();
        Ext.ToolTip.superclass.hide.call(this)
    },
    show: function() {
        this.showAt(this.getTargetXY())
    },
    showAt: function(A) {
        this.lastActive = new Date();
        this.clearTimers();
        Ext.ToolTip.superclass.showAt.call(this, A);
        if (this.dismissDelay && this.autoHide !== false) {
            this.dismissTimer = this.hide.defer(this.dismissDelay, this)
        }
    },
    clearTimer: function(A) {
        A = A + "Timer";
        clearTimeout(this[A]);
        delete this[A]
    },
    clearTimers: function() {
        this.clearTimer("show");
        this.clearTimer("dismiss");
        this.clearTimer("hide")
    },
    onShow: function() {
        Ext.ToolTip.superclass.onShow.call(this);
        Ext.getDoc().on("mousedown", this.onDocMouseDown, this)
    },
    onHide: function() {
        Ext.ToolTip.superclass.onHide.call(this);
        Ext.getDoc().un("mousedown", this.onDocMouseDown, this)
    },
    onDocMouseDown: function(A) {
        if (this.autoHide !== false && !A.within(this.el.dom)) {
            this.disable();
            this.enable.defer(100, this)
        }
    },
    onDisable: function() {
        this.clearTimers();
        this.hide()
    },
    adjustPosition: function(A, D) {
        var C = this.targetXY[1],
        B = this.getSize().height;
        if (this.constrainPosition && D <= C && (D + B) >= C) {
            D = C - B - 5
        }
        return {
            x: A,
            y: D
        }
    },
    onDestroy: function() {
        Ext.ToolTip.superclass.onDestroy.call(this);
        if (this.target) {
            this.target.un("mouseover", this.onTargetOver, this);
            this.target.un("mouseout", this.onTargetOut, this);
            this.target.un("mousemove", this.onMouseMove, this)
        }
    }
});
Ext.QuickTip = Ext.extend(Ext.ToolTip, {
    interceptTitles: false,
    tagConfig: {
        namespace: "ext",
        attribute: "qtip",
        width: "qwidth",
        target: "target",
        title: "qtitle",
        hide: "hide",
        cls: "qclass",
        align: "qalign"
    },
    initComponent: function() {
        this.target = this.target || Ext.getDoc();
        this.targets = this.targets || {};
        Ext.QuickTip.superclass.initComponent.call(this)
    },
    register: function(D) {
        var F = Ext.isArray(D) ? D: arguments;
        for (var E = 0, A = F.length; E < A; E++) {
            var H = F[E];
            var G = H.target;
            if (G) {
                if (Ext.isArray(G)) {
                    for (var C = 0, B = G.length; C < B; C++) {
                        this.targets[Ext.id(G[C])] = H
                    }
                } else {
                    this.targets[Ext.id(G)] = H
                }
            }
        }
    },
    unregister: function(A) {
        delete this.targets[Ext.id(A)]
    },
    onTargetOver: function(G) {
        if (this.disabled) {
            return
        }
        this.targetXY = G.getXY();
        var C = G.getTarget();
        if (!C || C.nodeType !== 1 || C == document || C == document.body) {
            return
        }
        if (this.activeTarget && C == this.activeTarget.el) {
            this.clearTimer("hide");
            this.show();
            return
        }
        if (C && this.targets[C.id]) {
            this.activeTarget = this.targets[C.id];
            this.activeTarget.el = C;
            this.delayShow();
            return
        }
        var E, F = Ext.fly(C),
        B = this.tagConfig;
        var D = B.namespace;
        if (this.interceptTitles && C.title) {
            E = C.title;
            C.qtip = E;
            C.removeAttribute("title");
            G.preventDefault()
        } else {
            E = C.qtip || F.getAttributeNS(D, B.attribute)
        }
        if (E) {
            var A = F.getAttributeNS(D, B.hide);
            this.activeTarget = {
                el: C,
                text: E,
                width: F.getAttributeNS(D, B.width),
                autoHide: A != "user" && A !== "false",
                title: F.getAttributeNS(D, B.title),
                cls: F.getAttributeNS(D, B.cls),
                align: F.getAttributeNS(D, B.align)
            };
            this.delayShow()
        }
    },
    onTargetOut: function(A) {
        this.clearTimer("show");
        if (this.autoHide !== false) {
            this.delayHide()
        }
    },
    showAt: function(B) {
        var A = this.activeTarget;
        if (A) {
            if (!this.rendered) {
                this.render(Ext.getBody());
                this.activeTarget = A
            }
            if (A.width) {
                this.setWidth(A.width);
                this.body.setWidth(this.adjustBodyWidth(A.width - this.getFrameWidth()));
                this.measureWidth = false
            } else {
                this.measureWidth = true
            }
            this.setTitle(A.title || "");
            this.body.update(A.text);
            this.autoHide = A.autoHide;
            this.dismissDelay = A.dismissDelay || this.dismissDelay;
            if (this.lastCls) {
                this.el.removeClass(this.lastCls);
                delete this.lastCls
            }
            if (A.cls) {
                this.el.addClass(A.cls);
                this.lastCls = A.cls
            }
            if (A.align) {
                B = this.el.getAlignToXY(A.el, A.align);
                this.constrainPosition = false
            } else {
                this.constrainPosition = true
            }
        }
        Ext.QuickTip.superclass.showAt.call(this, B)
    },
    hide: function() {
        delete this.activeTarget;
        Ext.QuickTip.superclass.hide.call(this)
    }
});
Ext.QuickTips = function() {
    var B, A = [];
    return {
        init: function(C) {
            if (!B) {
                if (!Ext.isReady) {
                    Ext.onReady(function() {
                        Ext.QuickTips.init(C)
                    });
                    return
                }
                B = new Ext.QuickTip({
                    elements: "header,body"
                });
                if (C !== false) {
                    B.render(Ext.getBody())
                }
            }
        },
        enable: function() {
            if (B) {
                A.pop();
                if (A.length < 1) {
                    B.enable()
                }
            }
        },
        disable: function() {
            if (B) {
                B.disable()
            }
            A.push(1)
        },
        isEnabled: function() {
            return B !== undefined && !B.disabled
        },
        getQuickTip: function() {
            return B
        },
        register: function() {
            B.register.apply(B, arguments)
        },
        unregister: function() {
            B.unregister.apply(B, arguments)
        },
        tips: function() {
            B.register.apply(B, arguments)
        }
    }
} ();
Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
    rootVisible: true,
    animate: Ext.enableFx,
    lines: true,
    enableDD: false,
    hlDrop: Ext.enableFx,
    pathSeparator: "/",
    initComponent: function() {
        Ext.tree.TreePanel.superclass.initComponent.call(this);
        if (!this.eventModel) {
            this.eventModel = new Ext.tree.TreeEventModel(this)
        }
        var A = this.loader;
        if (!A) {
            A = new Ext.tree.TreeLoader({
                dataUrl: this.dataUrl
            })
        } else {
            if (typeof A == "object" && !A.load) {
                A = new Ext.tree.TreeLoader(A)
            }
        }
        this.loader = A;
        this.nodeHash = {};
        if (this.root) {
            this.setRootNode(this.root)
        }
        this.addEvents("append", "remove", "movenode", "insert", "beforeappend", "beforeremove", "beforemovenode", "beforeinsert", "beforeload", "load", "textchange", "beforeexpandnode", "beforecollapsenode", "expandnode", "disabledchange", "collapsenode", "beforeclick", "click", "checkchange", "dblclick", "contextmenu", "beforechildrenrendered", "startdrag", "enddrag", "dragdrop", "beforenodedrop", "nodedrop", "nodedragover");
        if (this.singleExpand) {
            this.on("beforeexpandnode", this.restrictExpand, this)
        }
    },
    proxyNodeEvent: function(C, B, A, G, F, E, D) {
        if (C == "collapse" || C == "expand" || C == "beforecollapse" || C == "beforeexpand" || C == "move" || C == "beforemove") {
            C = C + "node"
        }
        return this.fireEvent(C, B, A, G, F, E, D)
    },
    getRootNode: function() {
        return this.root
    },
    setRootNode: function(B) {
        if (!B.render) {
            B = this.loader.createNode(B)
        }
        this.root = B;
        B.ownerTree = this;
        B.isRoot = true;
        this.registerNode(B);
        if (!this.rootVisible) {
            var A = B.attributes.uiProvider;
            B.ui = A ? new A(B) : new Ext.tree.RootTreeNodeUI(B)
        }
        return B
    },
    getNodeById: function(A) {
        return this.nodeHash[A]
    },
    registerNode: function(A) {
        this.nodeHash[A.id] = A
    },
    unregisterNode: function(A) {
        delete this.nodeHash[A.id]
    },
    toString: function() {
        return "[Tree" + (this.id ? " " + this.id: "") + "]"
    },
    restrictExpand: function(A) {
        var B = A.parentNode;
        if (B) {
            if (B.expandedChild && B.expandedChild.parentNode == B) {
                B.expandedChild.collapse()
            }
            B.expandedChild = A
        }
    },
    getChecked: function(A, B) {
        B = B || this.root;
        var C = [];
        var D = function() {
            if (this.attributes.checked) {
                C.push(!A ? this: (A == "id" ? this.id: this.attributes[A]))
            }
        };
        B.cascade(D);
        return C
    },
    getEl: function() {
        return this.el
    },
    getLoader: function() {
        return this.loader
    },
    expandAll: function() {
        this.root.expand(true)
    },
    collapseAll: function() {
        this.root.collapse(true)
    },
    getSelectionModel: function() {
        if (!this.selModel) {
            this.selModel = new Ext.tree.DefaultSelectionModel()
        }
        return this.selModel
    },
    expandPath: function(F, A, G) {
        A = A || "id";
        var D = F.split(this.pathSeparator);
        var C = this.root;
        if (C.attributes[A] != D[1]) {
            if (G) {
                G(false, null)
            }
            return
        }
        var B = 1;
        var E = function() {
            if (++B == D.length) {
                if (G) {
                    G(true, C)
                }
                return
            }
            var H = C.findChild(A, D[B]);
            if (!H) {
                if (G) {
                    G(false, C)
                }
                return
            }
            C = H;
            H.expand(false, false, E)
        };
        C.expand(false, false, E)
    },
    selectPath: function(E, A, F) {
        A = A || "id";
        var C = E.split(this.pathSeparator);
        var B = C.pop();
        if (C.length > 0) {
            var D = function(H, G) {
                if (H && G) {
                    var I = G.findChild(A, B);
                    if (I) {
                        I.select();
                        if (F) {
                            F(true, I)
                        }
                    } else {
                        if (F) {
                            F(false, I)
                        }
                    }
                } else {
                    if (F) {
                        F(false, I)
                    }
                }
            };
            this.expandPath(C.join(this.pathSeparator), A, D)
        } else {
            this.root.select();
            if (F) {
                F(true, this.root)
            }
        }
    },
    getTreeEl: function() {
        return this.body
    },
    onRender: function(B, A) {
        Ext.tree.TreePanel.superclass.onRender.call(this, B, A);
        this.el.addClass("x-tree");
        this.innerCt = this.body.createChild({
            tag: "ul",
            cls: "x-tree-root-ct " + (this.useArrows ? "x-tree-arrows": this.lines ? "x-tree-lines": "x-tree-no-lines")
        })
    },
    initEvents: function() {
        Ext.tree.TreePanel.superclass.initEvents.call(this);
        if (this.containerScroll) {
            Ext.dd.ScrollManager.register(this.body)
        }
        if ((this.enableDD || this.enableDrop) && !this.dropZone) {
            this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
                ddGroup: this.ddGroup || "TreeDD",
                appendOnly: this.ddAppendOnly === true
            })
        }
        if ((this.enableDD || this.enableDrag) && !this.dragZone) {
            this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
                ddGroup: this.ddGroup || "TreeDD",
                scroll: this.ddScroll
            })
        }
        this.getSelectionModel().init(this)
    },
    afterRender: function() {
        Ext.tree.TreePanel.superclass.afterRender.call(this);
        this.root.render();
        if (!this.rootVisible) {
            this.root.renderChildren()
        }
    },
    onDestroy: function() {
        if (this.rendered) {
            this.body.removeAllListeners();
            Ext.dd.ScrollManager.unregister(this.body);
            if (this.dropZone) {
                this.dropZone.unreg()
            }
            if (this.dragZone) {
                this.dragZone.unreg()
            }
        }
        this.root.destroy();
        this.nodeHash = null;
        Ext.tree.TreePanel.superclass.onDestroy.call(this)
    }
});
Ext.tree.TreePanel.nodeTypes = {};
Ext.reg("treepanel", Ext.tree.TreePanel);
Ext.tree.TreeEventModel = function(A) {
    this.tree = A;
    this.tree.on("render", this.initEvents, this)
};
Ext.tree.TreeEventModel.prototype = {
    initEvents: function() {
        var A = this.tree.getTreeEl();
        A.on("click", this.delegateClick, this);
        if (this.tree.trackMouseOver !== false) {
            A.on("mouseover", this.delegateOver, this);
            A.on("mouseout", this.delegateOut, this)
        }
        A.on("dblclick", this.delegateDblClick, this);
        A.on("contextmenu", this.delegateContextMenu, this)
    },
    getNode: function(B) {
        var A;
        if (A = B.getTarget(".x-tree-node-el", 10)) {
            var C = Ext.fly(A, "_treeEvents").getAttributeNS("ext", "tree-node-id");
            if (C) {
                return this.tree.getNodeById(C)
            }
        }
        return null
    },
    getNodeTarget: function(B) {
        var A = B.getTarget(".x-tree-node-icon", 1);
        if (!A) {
            A = B.getTarget(".x-tree-node-el", 6)
        }
        return A
    },
    delegateOut: function(B, A) {
        if (!this.beforeEvent(B)) {
            return
        }
        if (B.getTarget(".x-tree-ec-icon", 1)) {
            var C = this.getNode(B);
            this.onIconOut(B, C);
            if (C == this.lastEcOver) {
                delete this.lastEcOver
            }
        }
        if ((A = this.getNodeTarget(B)) && !B.within(A, true)) {
            this.onNodeOut(B, this.getNode(B))
        }
    },
    delegateOver: function(B, A) {
        if (!this.beforeEvent(B)) {
            return
        }
        if (this.lastEcOver) {
            this.onIconOut(B, this.lastEcOver);
            delete this.lastEcOver
        }
        if (B.getTarget(".x-tree-ec-icon", 1)) {
            this.lastEcOver = this.getNode(B);
            this.onIconOver(B, this.lastEcOver)
        }
        if (A = this.getNodeTarget(B)) {
            this.onNodeOver(B, this.getNode(B))
        }
    },
    delegateClick: function(B, A) {
        if (!this.beforeEvent(B)) {
            return
        }
        if (B.getTarget("input[type=checkbox]", 1)) {
            this.onCheckboxClick(B, this.getNode(B))
        } else {
            if (B.getTarget(".x-tree-ec-icon", 1)) {
                this.onIconClick(B, this.getNode(B))
            } else {
                if (this.getNodeTarget(B)) {
                    this.onNodeClick(B, this.getNode(B))
                }
            }
        }
    },
    delegateDblClick: function(B, A) {
        if (this.beforeEvent(B) && this.getNodeTarget(B)) {
            this.onNodeDblClick(B, this.getNode(B))
        }
    },
    delegateContextMenu: function(B, A) {
        if (this.beforeEvent(B) && this.getNodeTarget(B)) {
            this.onNodeContextMenu(B, this.getNode(B))
        }
    },
    onNodeClick: function(B, A) {
        A.ui.onClick(B)
    },
    onNodeOver: function(B, A) {
        A.ui.onOver(B)
    },
    onNodeOut: function(B, A) {
        A.ui.onOut(B)
    },
    onIconOver: function(B, A) {
        A.ui.addClass("x-tree-ec-over")
    },
    onIconOut: function(B, A) {
        A.ui.removeClass("x-tree-ec-over")
    },
    onIconClick: function(B, A) {
        A.ui.ecClick(B)
    },
    onCheckboxClick: function(B, A) {
        A.ui.onCheckChange(B)
    },
    onNodeDblClick: function(B, A) {
        A.ui.onDblClick(B)
    },
    onNodeContextMenu: function(B, A) {
        A.ui.onContextMenu(B)
    },
    beforeEvent: function(A) {
        if (this.disabled) {
            A.stopEvent();
            return false
        }
        return true
    },
    disable: function() {
        this.disabled = true
    },
    enable: function() {
        this.disabled = false
    }
};
Ext.tree.DefaultSelectionModel = function(A) {
    this.selNode = null;
    this.addEvents("selectionchange", "beforeselect");
    Ext.apply(this, A);
    Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {
    init: function(A) {
        this.tree = A;
        A.getTreeEl().on("keydown", this.onKeyDown, this);
        A.on("click", this.onNodeClick, this)
    },
    onNodeClick: function(A, B) {
        this.select(A)
    },
    select: function(B) {
        var A = this.selNode;
        if (A != B && this.fireEvent("beforeselect", this, B, A) !== false) {
            if (A) {
                A.ui.onSelectedChange(false)
            }
            this.selNode = B;
            B.ui.onSelectedChange(true);
            this.fireEvent("selectionchange", this, B, A)
        }
        return B
    },
    unselect: function(A) {
        if (this.selNode == A) {
            this.clearSelections()
        }
    },
    clearSelections: function() {
        var A = this.selNode;
        if (A) {
            A.ui.onSelectedChange(false);
            this.selNode = null;
            this.fireEvent("selectionchange", this, null)
        }
        return A
    },
    getSelectedNode: function() {
        return this.selNode
    },
    isSelected: function(A) {
        return this.selNode == A
    },
    selectPrevious: function() {
        var A = this.selNode || this.lastSelNode;
        if (!A) {
            return null
        }
        var C = A.previousSibling;
        if (C) {
            if (!C.isExpanded() || C.childNodes.length < 1) {
                return this.select(C)
            } else {
                var B = C.lastChild;
                while (B && B.isExpanded() && B.childNodes.length > 0) {
                    B = B.lastChild
                }
                return this.select(B)
            }
        } else {
            if (A.parentNode && (this.tree.rootVisible || !A.parentNode.isRoot)) {
                return this.select(A.parentNode)
            }
        }
        return null
    },
    selectNext: function() {
        var B = this.selNode || this.lastSelNode;
        if (!B) {
            return null
        }
        if (B.firstChild && B.isExpanded()) {
            return this.select(B.firstChild)
        } else {
            if (B.nextSibling) {
                return this.select(B.nextSibling)
            } else {
                if (B.parentNode) {
                    var A = null;
                    B.parentNode.bubble(function() {
                        if (this.nextSibling) {
                            A = this.getOwnerTree().selModel.select(this.nextSibling);
                            return false
                        }
                    });
                    return A
                }
            }
        }
        return null
    },
    onKeyDown: function(C) {
        var B = this.selNode || this.lastSelNode;
        var D = this;
        if (!B) {
            return
        }
        var A = C.getKey();
        switch (A) {
        case C.DOWN:
            C.stopEvent();
            this.selectNext();
            break;
        case C.UP:
            C.stopEvent();
            this.selectPrevious();
            break;
        case C.RIGHT:
            C.preventDefault();
            if (B.hasChildNodes()) {
                if (!B.isExpanded()) {
                    B.expand()
                } else {
                    if (B.firstChild) {
                        this.select(B.firstChild, C)
                    }
                }
            }
            break;
        case C.LEFT:
            C.preventDefault();
            if (B.hasChildNodes() && B.isExpanded()) {
                B.collapse()
            } else {
                if (B.parentNode && (this.tree.rootVisible || B.parentNode != this.tree.getRootNode())) {
                    this.select(B.parentNode, C)
                }
            }
            break
        }
    }
});
Ext.tree.MultiSelectionModel = function(A) {
    this.selNodes = [];
    this.selMap = {};
    this.addEvents("selectionchange");
    Ext.apply(this, A);
    Ext.tree.MultiSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {
    init: function(A) {
        this.tree = A;
        A.getTreeEl().on("keydown", this.onKeyDown, this);
        A.on("click", this.onNodeClick, this)
    },
    onNodeClick: function(A, B) {
        this.select(A, B, B.ctrlKey)
    },
    select: function(A, C, B) {
        if (B !== true) {
            this.clearSelections(true)
        }
        if (this.isSelected(A)) {
            this.lastSelNode = A;
            return A
        }
        this.selNodes.push(A);
        this.selMap[A.id] = A;
        this.lastSelNode = A;
        A.ui.onSelectedChange(true);
        this.fireEvent("selectionchange", this, this.selNodes);
        return A
    },
    unselect: function(B) {
        if (this.selMap[B.id]) {
            B.ui.onSelectedChange(false);
            var C = this.selNodes;
            var A = C.indexOf(B);
            if (A != -1) {
                this.selNodes.splice(A, 1)
            }
            delete this.selMap[B.id];
            this.fireEvent("selectionchange", this, this.selNodes)
        }
    },
    clearSelections: function(B) {
        var D = this.selNodes;
        if (D.length > 0) {
            for (var C = 0, A = D.length; C < A; C++) {
                D[C].ui.onSelectedChange(false)
            }
            this.selNodes = [];
            this.selMap = {};
            if (B !== true) {
                this.fireEvent("selectionchange", this, this.selNodes)
            }
        }
    },
    isSelected: function(A) {
        return this.selMap[A.id] ? true: false
    },
    getSelectedNodes: function() {
        return this.selNodes
    },
    onKeyDown: Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
    selectNext: Ext.tree.DefaultSelectionModel.prototype.selectNext,
    selectPrevious: Ext.tree.DefaultSelectionModel.prototype.selectPrevious
});
Ext.tree.TreeNode = function(A) {
    A = A || {};
    if (typeof A == "string") {
        A = {
            text: A
        }
    }
    this.childrenRendered = false;
    this.rendered = false;
    Ext.tree.TreeNode.superclass.constructor.call(this, A);
    this.expanded = A.expanded === true;
    this.isTarget = A.isTarget !== false;
    this.draggable = A.draggable !== false && A.allowDrag !== false;
    this.allowChildren = A.allowChildren !== false && A.allowDrop !== false;
    this.text = A.text;
    this.disabled = A.disabled === true;
    this.addEvents("textchange", "beforeexpand", "beforecollapse", "expand", "disabledchange", "collapse", "beforeclick", "click", "checkchange", "dblclick", "contextmenu", "beforechildrenrendered");
    var B = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
    this.ui = new B(this)
};
Ext.extend(Ext.tree.TreeNode, Ext.data.Node, {
    preventHScroll: true,
    isExpanded: function() {
        return this.expanded
    },
    getUI: function() {
        return this.ui
    },
    getLoader: function() {
        var A;
        return this.loader || ((A = this.getOwnerTree()) && A.loader ? A.loader: new Ext.tree.TreeLoader())
    },
    setFirstChild: function(A) {
        var B = this.firstChild;
        Ext.tree.TreeNode.superclass.setFirstChild.call(this, A);
        if (this.childrenRendered && B && A != B) {
            B.renderIndent(true, true)
        }
        if (this.rendered) {
            this.renderIndent(true, true)
        }
    },
    setLastChild: function(B) {
        var A = this.lastChild;
        Ext.tree.TreeNode.superclass.setLastChild.call(this, B);
        if (this.childrenRendered && A && B != A) {
            A.renderIndent(true, true)
        }
        if (this.rendered) {
            this.renderIndent(true, true)
        }
    },
    appendChild: function(B) {
        if (!B.render && !Ext.isArray(B)) {
            B = this.getLoader().createNode(B)
        }
        var A = Ext.tree.TreeNode.superclass.appendChild.call(this, B);
        if (A && this.childrenRendered) {
            A.render()
        }
        this.ui.updateExpandIcon();
        return A
    },
    removeChild: function(A) {
        this.ownerTree.getSelectionModel().unselect(A);
        Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
        if (this.childrenRendered) {
            A.ui.remove()
        }
        if (this.childNodes.length < 1) {
            this.collapse(false, false)
        } else {
            this.ui.updateExpandIcon()
        }
        if (!this.firstChild && !this.isHiddenRoot()) {
            this.childrenRendered = false
        }
        return A
    },
    insertBefore: function(C, A) {
        if (!C.render) {
            C = this.getLoader().createNode(C)
        }
        var B = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments);
        if (B && A && this.childrenRendered) {
            C.render()
        }
        this.ui.updateExpandIcon();
        return B
    },
    setText: function(B) {
        var A = this.text;
        this.text = B;
        this.attributes.text = B;
        if (this.rendered) {
            this.ui.onTextChange(this, B, A)
        }
        this.fireEvent("textchange", this, B, A)
    },
    select: function() {
        this.getOwnerTree().getSelectionModel().select(this)
    },
    unselect: function() {
        this.getOwnerTree().getSelectionModel().unselect(this)
    },
    isSelected: function() {
        return this.getOwnerTree().getSelectionModel().isSelected(this)
    },
    expand: function(A, B, C) {
        if (!this.expanded) {
            if (this.fireEvent("beforeexpand", this, A, B) === false) {
                return
            }
            if (!this.childrenRendered) {
                this.renderChildren()
            }
            this.expanded = true;
            if (!this.isHiddenRoot() && (this.getOwnerTree().animate && B !== false) || B) {
                this.ui.animExpand(function() {
                    this.fireEvent("expand", this);
                    if (typeof C == "function") {
                        C(this)
                    }
                    if (A === true) {
                        this.expandChildNodes(true)
                    }
                }.createDelegate(this));
                return
            } else {
                this.ui.expand();
                this.fireEvent("expand", this);
                if (typeof C == "function") {
                    C(this)
                }
            }
        } else {
            if (typeof C == "function") {
                C(this)
            }
        }
        if (A === true) {
            this.expandChildNodes(true)
        }
    },
    isHiddenRoot: function() {
        return this.isRoot && !this.getOwnerTree().rootVisible
    },
    collapse: function(B, E) {
        if (this.expanded && !this.isHiddenRoot()) {
            if (this.fireEvent("beforecollapse", this, B, E) === false) {
                return
            }
            this.expanded = false;
            if ((this.getOwnerTree().animate && E !== false) || E) {
                this.ui.animCollapse(function() {
                    this.fireEvent("collapse", this);
                    if (B === true) {
                        this.collapseChildNodes(true)
                    }
                }.createDelegate(this));
                return
            } else {
                this.ui.collapse();
                this.fireEvent("collapse", this)
            }
        }
        if (B === true) {
            var D = this.childNodes;
            for (var C = 0, A = D.length; C < A; C++) {
                D[C].collapse(true, false)
            }
        }
    },
    delayedExpand: function(A) {
        if (!this.expandProcId) {
            this.expandProcId = this.expand.defer(A, this)
        }
    },
    cancelExpand: function() {
        if (this.expandProcId) {
            clearTimeout(this.expandProcId)
        }
        this.expandProcId = false
    },
    toggle: function() {
        if (this.expanded) {
            this.collapse()
        } else {
            this.expand()
        }
    },
    ensureVisible: function(B) {
        var A = this.getOwnerTree();
        A.expandPath(this.parentNode.getPath(), false,
        function() {
            var C = A.getNodeById(this.id);
            A.getTreeEl().scrollChildIntoView(C.ui.anchor);
            Ext.callback(B)
        }.createDelegate(this))
    },
    expandChildNodes: function(B) {
        var D = this.childNodes;
        for (var C = 0, A = D.length; C < A; C++) {
            D[C].expand(B)
        }
    },
    collapseChildNodes: function(B) {
        var D = this.childNodes;
        for (var C = 0, A = D.length; C < A; C++) {
            D[C].collapse(B)
        }
    },
    disable: function() {
        this.disabled = true;
        this.unselect();
        if (this.rendered && this.ui.onDisableChange) {
            this.ui.onDisableChange(this, true)
        }
        this.fireEvent("disabledchange", this, true)
    },
    enable: function() {
        this.disabled = false;
        if (this.rendered && this.ui.onDisableChange) {
            this.ui.onDisableChange(this, false)
        }
        this.fireEvent("disabledchange", this, false)
    },
    renderChildren: function(B) {
        if (B !== false) {
            this.fireEvent("beforechildrenrendered", this)
        }
        var D = this.childNodes;
        for (var C = 0, A = D.length; C < A; C++) {
            D[C].render(true)
        }
        this.childrenRendered = true
    },
    sort: function(E, D) {
        Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
        if (this.childrenRendered) {
            var C = this.childNodes;
            for (var B = 0, A = C.length; B < A; B++) {
                C[B].render(true)
            }
        }
    },
    render: function(A) {
        this.ui.render(A);
        if (!this.rendered) {
            this.getOwnerTree().registerNode(this);
            this.rendered = true;
            if (this.expanded) {
                this.expanded = false;
                this.expand(false, false)
            }
        }
    },
    renderIndent: function(B, E) {
        if (E) {
            this.ui.childIndent = null
        }
        this.ui.renderIndent();
        if (B === true && this.childrenRendered) {
            var D = this.childNodes;
            for (var C = 0, A = D.length; C < A; C++) {
                D[C].renderIndent(true, E)
            }
        }
    },
    beginUpdate: function() {
        this.childrenRendered = false
    },
    endUpdate: function() {
        if (this.expanded && this.rendered) {
            this.renderChildren()
        }
    },
    destroy: function() {
        if (this.childNodes) {
            for (var B = 0, A = this.childNodes.length; B < A; B++) {
                this.childNodes[B].destroy()
            }
            this.childNodes = null
        }
        if (this.ui.destroy) {
            this.ui.destroy()
        }
    }
});
Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;
Ext.tree.AsyncTreeNode = function(A) {
    this.loaded = A && A.loaded === true;
    this.loading = false;
    Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
    this.addEvents("beforeload", "load")
};
Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
    expand: function(B, D, F) {
        if (this.loading) {
            var E;
            var C = function() {
                if (!this.loading) {
                    clearInterval(E);
                    this.expand(B, D, F)
                }
            }.createDelegate(this);
            E = setInterval(C, 200);
            return
        }
        if (!this.loaded) {
            if (this.fireEvent("beforeload", this) === false) {
                return
            }
            this.loading = true;
            this.ui.beforeLoad(this);
            var A = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
            if (A) {
                A.load(this, this.loadComplete.createDelegate(this, [B, D, F]));
                return
            }
        }
        Ext.tree.AsyncTreeNode.superclass.expand.call(this, B, D, F)
    },
    isLoading: function() {
        return this.loading
    },
    loadComplete: function(A, B, C) {
        this.loading = false;
        this.loaded = true;
        this.ui.afterLoad(this);
        this.fireEvent("load", this);
        this.expand(A, B, C)
    },
    isLoaded: function() {
        return this.loaded
    },
    hasChildNodes: function() {
        if (!this.isLeaf() && !this.loaded) {
            return true
        } else {
            return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this)
        }
    },
    reload: function(A) {
        this.collapse(false, false);
        while (this.firstChild) {
            this.removeChild(this.firstChild)
        }
        this.childrenRendered = false;
        this.loaded = false;
        if (this.isHiddenRoot()) {
            this.expanded = false
        }
        this.expand(false, false, A)
    }
});
Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;
Ext.tree.TreeNodeUI = function(A) {
    this.node = A;
    this.rendered = false;
    this.animating = false;
    this.wasLeaf = true;
    this.ecc = "x-tree-ec-icon x-tree-elbow";
    this.emptyIcon = Ext.BLANK_IMAGE_URL
};
Ext.tree.TreeNodeUI.prototype = {
    removeChild: function(A) {
        if (this.rendered) {
            this.ctNode.removeChild(A.ui.getEl())
        }
    },
    beforeLoad: function() {
        this.addClass("x-tree-node-loading")
    },
    afterLoad: function() {
        this.removeClass("x-tree-node-loading")
    },
    onTextChange: function(B, C, A) {
        if (this.rendered) {
            this.textNode.innerHTML = C
        }
    },
    onDisableChange: function(A, B) {
        this.disabled = B;
        if (this.checkbox) {
            this.checkbox.disabled = B
        }
        if (B) {
            this.addClass("x-tree-node-disabled")
        } else {
            this.removeClass("x-tree-node-disabled")
        }
    },
    onSelectedChange: function(A) {
        if (A) {
            this.focus();
            this.addClass("x-tree-selected")
        } else {
            this.removeClass("x-tree-selected")
        }
    },
    onMove: function(A, G, E, F, D, B) {
        this.childIndent = null;
        if (this.rendered) {
            var H = F.ui.getContainer();
            if (!H) {
                this.holder = document.createElement("div");
                this.holder.appendChild(this.wrap);
                return
            }
            var C = B ? B.ui.getEl() : null;
            if (C) {
                H.insertBefore(this.wrap, C)
            } else {
                H.appendChild(this.wrap)
            }
            this.node.renderIndent(true)
        }
    },
    addClass: function(A) {
        if (this.elNode) {
            Ext.fly(this.elNode).addClass(A)
        }
    },
    removeClass: function(A) {
        if (this.elNode) {
            Ext.fly(this.elNode).removeClass(A)
        }
    },
    remove: function() {
        if (this.rendered) {
            this.holder = document.createElement("div");
            this.holder.appendChild(this.wrap)
        }
    },
    fireEvent: function() {
        return this.node.fireEvent.apply(this.node, arguments)
    },
    initEvents: function() {
        this.node.on("move", this.onMove, this);
        if (this.node.disabled) {
            this.addClass("x-tree-node-disabled");
            if (this.checkbox) {
                this.checkbox.disabled = true
            }
        }
        if (this.node.hidden) {
            this.hide()
        }
        var B = this.node.getOwnerTree();
        var A = B.enableDD || B.enableDrag || B.enableDrop;
        if (A && (!this.node.isRoot || B.rootVisible)) {
            Ext.dd.Registry.register(this.elNode, {
                node: this.node,
                handles: this.getDDHandles(),
                isHandle: false
            })
        }
    },
    getDDHandles: function() {
        return [this.iconNode, this.textNode, this.elNode]
    },
    hide: function() {
        this.node.hidden = true;
        if (this.wrap) {
            this.wrap.style.display = "none"
        }
    },
    show: function() {
        this.node.hidden = false;
        if (this.wrap) {
            this.wrap.style.display = ""
        }
    },
    onContextMenu: function(A) {
        if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {
            A.preventDefault();
            this.focus();
            this.fireEvent("contextmenu", this.node, A)
        }
    },
    onClick: function(B) {
        if (this.dropping) {
            B.stopEvent();
            return
        }
        if (this.fireEvent("beforeclick", this.node, B) !== false) {
            var A = B.getTarget("a");
            if (!this.disabled && this.node.attributes.href && A) {
                this.fireEvent("click", this.node, B);
                return
            } else {
                if (A && B.ctrlKey) {
                    B.stopEvent()
                }
            }
            B.preventDefault();
            if (this.disabled) {
                return
            }
            if (this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()) {
                this.node.toggle()
            }
            this.fireEvent("click", this.node, B)
        } else {
            B.stopEvent()
        }
    },
    onDblClick: function(A) {
        A.preventDefault();
        if (this.disabled) {
            return
        }
        if (this.checkbox) {
            this.toggleCheck()
        }
        if (!this.animating && this.node.isExpandable()) {
            this.node.toggle()
        }
        this.fireEvent("dblclick", this.node, A)
    },
    onOver: function(A) {
        this.addClass("x-tree-node-over")
    },
    onOut: function(A) {
        this.removeClass("x-tree-node-over")
    },
    onCheckChange: function() {
        var A = this.checkbox.checked;
        this.checkbox.defaultChecked = A;
        this.node.attributes.checked = A;
        this.fireEvent("checkchange", this.node, A)
    },
    ecClick: function(A) {
        if (!this.animating && this.node.isExpandable()) {
            this.node.toggle()
        }
    },
    startDrop: function() {
        this.dropping = true
    },
    endDrop: function() {
        setTimeout(function() {
            this.dropping = false
        }.createDelegate(this), 50)
    },
    expand: function() {
        this.updateExpandIcon();
        this.ctNode.style.display = ""
    },
    focus: function() {
        if (!this.node.preventHScroll) {
            try {
                this.anchor.focus()
            } catch(C) {}
        } else {
            if (!Ext.isIE) {
                try {
                    var B = this.node.getOwnerTree().getTreeEl().dom;
                    var A = B.scrollLeft;
                    this.anchor.focus();
                    B.scrollLeft = A
                } catch(C) {}
            }
        }
    },
    toggleCheck: function(B) {
        var A = this.checkbox;
        if (A) {
            A.checked = (B === undefined ? !A.checked: B);
            this.onCheckChange()
        }
    },
    blur: function() {
        try {
            this.anchor.blur()
        } catch(A) {}
    },
    animExpand: function(B) {
        var A = Ext.get(this.ctNode);
        A.stopFx();
        if (!this.node.isExpandable()) {
            this.updateExpandIcon();
            this.ctNode.style.display = "";
            Ext.callback(B);
            return
        }
        this.animating = true;
        this.updateExpandIcon();
        A.slideIn("t", {
            callback: function() {
                this.animating = false;
                Ext.callback(B)
            },
            scope: this,
            duration: this.node.ownerTree.duration || 0.25
        })
    },
    highlight: function() {
        var A = this.node.getOwnerTree();
        Ext.fly(this.wrap).highlight(A.hlColor || "C3DAF9", {
            endColor: A.hlBaseColor
        })
    },
    collapse: function() {
        this.updateExpandIcon();
        this.ctNode.style.display = "none"
    },
    animCollapse: function(B) {
        var A = Ext.get(this.ctNode);
        A.enableDisplayMode("block");
        A.stopFx();
        this.animating = true;
        this.updateExpandIcon();
        A.slideOut("t", {
            callback: function() {
                this.animating = false;
                Ext.callback(B)
            },
            scope: this,
            duration: this.node.ownerTree.duration || 0.25
        })
    },
    getContainer: function() {
        return this.ctNode
    },
    getEl: function() {
        return this.wrap
    },
    appendDDGhost: function(A) {
        A.appendChild(this.elNode.cloneNode(true))
    },
    getDDRepairXY: function() {
        return Ext.lib.Dom.getXY(this.iconNode)
    },
    onRender: function() {
        this.render()
    },
    render: function(B) {
        var D = this.node,
        A = D.attributes;
        var C = D.parentNode ? D.parentNode.ui.getContainer() : D.ownerTree.innerCt.dom;
        if (!this.rendered) {
            this.rendered = true;
            this.renderElements(D, A, C, B);
            if (A.qtip) {
                if (this.textNode.setAttributeNS) {
                    this.textNode.setAttributeNS("ext", "qtip", A.qtip);
                    if (A.qtipTitle) {
                        this.textNode.setAttributeNS("ext", "qtitle", A.qtipTitle)
                    }
                } else {
                    this.textNode.setAttribute("ext:qtip", A.qtip);
                    if (A.qtipTitle) {
                        this.textNode.setAttribute("ext:qtitle", A.qtipTitle)
                    }
                }
            } else {
                if (A.qtipCfg) {
                    A.qtipCfg.target = Ext.id(this.textNode);
                    Ext.QuickTips.register(A.qtipCfg)
                }
            }
            this.initEvents();
            if (!this.node.expanded) {
                this.updateExpandIcon(true)
            }
        } else {
            if (B === true) {
                C.appendChild(this.wrap)
            }
        }
    },
    renderElements: function(D, I, H, J) {
        this.indentMarkup = D.parentNode ? D.parentNode.ui.getChildIndent() : "";
        var E = typeof I.checked == "boolean";
        var B = I.href ? I.href: Ext.isGecko ? "": "#";
        var C = ["<li class=\"x-tree-node\"><div ext:tree-node-id=\"", D.id, "\" class=\"x-tree-node-el x-tree-node-leaf x-unselectable ", I.cls, "\" unselectable=\"on\">", "<span class=\"x-tree-node-indent\">", this.indentMarkup, "</span>", "<img src=\"", this.emptyIcon, "\" class=\"x-tree-ec-icon x-tree-elbow\" />", "<img src=\"", I.icon || this.emptyIcon, "\" class=\"x-tree-node-icon", (I.icon ? " x-tree-node-inline-icon": ""), (I.iconCls ? " " + I.iconCls: ""), "\" unselectable=\"on\" />", E ? ("<input class=\"x-tree-node-cb\" type=\"checkbox\" " + (I.checked ? "checked=\"checked\" />": "/>")) : "", "<a hidefocus=\"on\" class=\"x-tree-node-anchor\" href=\"", B, "\" tabIndex=\"1\" ", I.hrefTarget ? " target=\"" + I.hrefTarget + "\"": "", "><span unselectable=\"on\">", D.text, "</span></a></div>", "<ul class=\"x-tree-node-ct\" style=\"display:none;\"></ul>", "</li>"].join("");
        var A;
        if (J !== true && D.nextSibling && (A = D.nextSibling.ui.getEl())) {
            this.wrap = Ext.DomHelper.insertHtml("beforeBegin", A, C)
        } else {
            this.wrap = Ext.DomHelper.insertHtml("beforeEnd", H, C)
        }
        this.elNode = this.wrap.childNodes[0];
        this.ctNode = this.wrap.childNodes[1];
        var G = this.elNode.childNodes;
        this.indentNode = G[0];
        this.ecNode = G[1];
        this.iconNode = G[2];
        var F = 3;
        if (E) {
            this.checkbox = G[3];
            this.checkbox.defaultChecked = this.checkbox.checked;
            F++
        }
        this.anchor = G[F];
        this.textNode = G[F].firstChild
    },
    getAnchor: function() {
        return this.anchor
    },
    getTextEl: function() {
        return this.textNode
    },
    getIconEl: function() {
        return this.iconNode
    },
    isChecked: function() {
        return this.checkbox ? this.checkbox.checked: false
    },
    updateExpandIcon: function() {
        if (this.rendered) {
            var E = this.node,
            D, C;
            var A = E.isLast() ? "x-tree-elbow-end": "x-tree-elbow";
            if (E.isExpandable()) {
                if (E.expanded) {
                    A += "-minus";
                    D = "x-tree-node-collapsed";
                    C = "x-tree-node-expanded"
                } else {
                    A += "-plus";
                    D = "x-tree-node-expanded";
                    C = "x-tree-node-collapsed"
                }
                if (this.wasLeaf) {
                    this.removeClass("x-tree-node-leaf");
                    this.wasLeaf = false
                }
                if (this.c1 != D || this.c2 != C) {
                    Ext.fly(this.elNode).replaceClass(D, C);
                    this.c1 = D;
                    this.c2 = C
                }
            } else {
                if (!this.wasLeaf) {
                    Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf");
                    delete this.c1;
                    delete this.c2;
                    this.wasLeaf = true
                }
            }
            var B = "x-tree-ec-icon " + A;
            if (this.ecc != B) {
                this.ecNode.className = B;
                this.ecc = B
            }
        }
    },
    getChildIndent: function() {
        if (!this.childIndent) {
            var A = [];
            var B = this.node;
            while (B) {
                if (!B.isRoot || (B.isRoot && B.ownerTree.rootVisible)) {
                    if (!B.isLast()) {
                        A.unshift("<img src=\"" + this.emptyIcon + "\" class=\"x-tree-elbow-line\" />")
                    } else {
                        A.unshift("<img src=\"" + this.emptyIcon + "\" class=\"x-tree-icon\" />")
                    }
                }
                B = B.parentNode
            }
            this.childIndent = A.join("")
        }
        return this.childIndent
    },
    renderIndent: function() {
        if (this.rendered) {
            var A = "";
            var B = this.node.parentNode;
            if (B) {
                A = B.ui.getChildIndent()
            }
            if (this.indentMarkup != A) {
                this.indentNode.innerHTML = A;
                this.indentMarkup = A
            }
            this.updateExpandIcon()
        }
    },
    destroy: function() {
        if (this.elNode) {
            Ext.dd.Registry.unregister(this.elNode.id)
        }
        delete this.elNode;
        delete this.ctNode;
        delete this.indentNode;
        delete this.ecNode;
        delete this.iconNode;
        delete this.checkbox;
        delete this.anchor;
        delete this.textNode;
        Ext.removeNode(this.ctNode)
    }
};
Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
    render: function() {
        if (!this.rendered) {
            var A = this.node.ownerTree.innerCt.dom;
            this.node.expanded = true;
            A.innerHTML = "<div class=\"x-tree-root-node\"></div>";
            this.wrap = this.ctNode = A.firstChild
        }
    },
    collapse: Ext.emptyFn,
    expand: Ext.emptyFn
});
Ext.tree.TreeLoader = function(A) {
    this.baseParams = {};
    Ext.apply(this, A);
    this.addEvents("beforeload", "load", "loadexception");
    Ext.tree.TreeLoader.superclass.constructor.call(this)
};
Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
    uiProviders: {},
    clearOnLoad: true,
    load: function(A, B) {
        if (this.clearOnLoad) {
            while (A.firstChild) {
                A.removeChild(A.firstChild)
            }
        }
        if (this.doPreload(A)) {
            if (typeof B == "function") {
                B()
            }
        } else {
            if (this.dataUrl || this.url) {
                this.requestData(A, B)
            }
        }
    },
    doPreload: function(D) {
        if (D.attributes.children) {
            if (D.childNodes.length < 1) {
                var C = D.attributes.children;
                D.beginUpdate();
                for (var B = 0, A = C.length; B < A; B++) {
                    var E = D.appendChild(this.createNode(C[B]));
                    if (this.preloadChildren) {
                        this.doPreload(E)
                    }
                }
                D.endUpdate()
            }
            return true
        } else {
            return false
        }
    },
    getParams: function(D) {
        var A = [],
        C = this.baseParams;
        for (var B in C) {
            if (typeof C[B] != "function") {
                A.push(encodeURIComponent(B), "=", encodeURIComponent(C[B]), "&")
            }
        }
        A.push("node=", encodeURIComponent(D.id));
        return A.join("")
    },
    requestData: function(A, B) {
        if (this.fireEvent("beforeload", this, A, B) !== false) {
            this.transId = Ext.Ajax.request({
                method: this.requestMethod,
                url: this.dataUrl || this.url,
                success: this.handleResponse,
                failure: this.handleFailure,
                scope: this,
                argument: {
                    callback: B,
                    node: A
                },
                params: this.getParams(A)
            })
        } else {
            if (typeof B == "function") {
                B()
            }
        }
    },
    isLoading: function() {
        return !! this.transId
    },
    abort: function() {
        if (this.isLoading()) {
            Ext.Ajax.abort(this.transId)
        }
    },
    createNode: function(attr) {
        if (this.baseAttrs) {
            Ext.applyIf(attr, this.baseAttrs)
        }
        if (this.applyLoader !== false) {
            attr.loader = this
        }
        if (typeof attr.uiProvider == "string") {
            attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider)
        }
        if (attr.nodeType) {
            return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr)
        } else {
            return attr.leaf ? new Ext.tree.TreeNode(attr) : new Ext.tree.AsyncTreeNode(attr)
        }
    },
    processResponse: function(response, node, callback) {
        var json = response.responseText;
        try {
            var o = eval("(" + json + ")");
            node.beginUpdate();
            for (var i = 0, len = o.length; i < len; i++) {
                var n = this.createNode(o[i]);
                if (n) {
                    node.appendChild(n)
                }
            }
            node.endUpdate();
            if (typeof callback == "function") {
                callback(this, node)
            }
        } catch(e) {
            this.handleFailure(response)
        }
    },
    handleResponse: function(B) {
        this.transId = false;
        var A = B.argument;
        this.processResponse(B, A.node, A.callback);
        this.fireEvent("load", this, A.node, B)
    },
    handleFailure: function(B) {
        this.transId = false;
        var A = B.argument;
        this.fireEvent("loadexception", this, A.node, B);
        if (typeof A.callback == "function") {
            A.callback(this, A.node)
        }
    }
});
Ext.tree.TreeFilter = function(A, B) {
    this.tree = A;
    this.filtered = {};
    Ext.apply(this, B)
};
Ext.tree.TreeFilter.prototype = {
    clearBlank: false,
    reverse: false,
    autoClear: false,
    remove: false,
    filter: function(D, A, B) {
        A = A || "text";
        var C;
        if (typeof D == "string") {
            var E = D.length;
            if (E == 0 && this.clearBlank) {
                this.clear();
                return
            }
            D = D.toLowerCase();
            C = function(F) {
                return F.attributes[A].substr(0, E).toLowerCase() == D
            }
        } else {
            if (D.exec) {
                C = function(F) {
                    return D.test(F.attributes[A])
                }
            } else {
                throw "Illegal filter type, must be string or regex"
            }
        }
        this.filterBy(C, null, B)
    },
    filterBy: function(D, C, B) {
        B = B || this.tree.root;
        if (this.autoClear) {
            this.clear()
        }
        var A = this.filtered,
        H = this.reverse;
        var E = function(J) {
            if (J == B) {
                return true
            }
            if (A[J.id]) {
                return false
            }
            var I = D.call(C || J, J);
            if (!I || H) {
                A[J.id] = J;
                J.ui.hide();
                return false
            }
            return true
        };
        B.cascade(E);
        if (this.remove) {
            for (var G in A) {
                if (typeof G != "function") {
                    var F = A[G];
                    if (F && F.parentNode) {
                        F.parentNode.removeChild(F)
                    }
                }
            }
        }
    },
    clear: function() {
        var B = this.tree;
        var A = this.filtered;
        for (var D in A) {
            if (typeof D != "function") {
                var C = A[D];
                if (C) {
                    C.ui.show()
                }
            }
        }
        this.filtered = {}
    }
};
Ext.tree.TreeSorter = function(B, C) {
    Ext.apply(this, C);
    B.on("beforechildrenrendered", this.doSort, this);
    B.on("append", this.updateSort, this);
    B.on("insert", this.updateSort, this);
    B.on("textchange", this.updateSortParent, this);
    var E = this.dir && this.dir.toLowerCase() == "desc";
    var F = this.property || "text";
    var G = this.sortType;
    var A = this.folderSort;
    var D = this.caseSensitive === true;
    var H = this.leafAttr || "leaf";
    this.sortFn = function(J, I) {
        if (A) {
            if (J.attributes[H] && !I.attributes[H]) {
                return 1
            }
            if (!J.attributes[H] && I.attributes[H]) {
                return - 1
            }
        }
        var L = G ? G(J) : (D ? J.attributes[F] : J.attributes[F].toUpperCase());
        var K = G ? G(I) : (D ? I.attributes[F] : I.attributes[F].toUpperCase());
        if (L < K) {
            return E ? +1 : -1
        } else {
            if (L > K) {
                return E ? -1 : +1
            } else {
                return 0
            }
        }
    }
};
Ext.tree.TreeSorter.prototype = {
    doSort: function(A) {
        A.sort(this.sortFn)
    },
    compareNodes: function(B, A) {
        return (B.text.toUpperCase() > A.text.toUpperCase() ? 1 : -1)
    },
    updateSort: function(A, B) {
        if (B.childrenRendered) {
            this.doSort.defer(1, this, [B])
        }
    },
    updateSortParent: function(A) {
        var B = A.parentNode;
        if (B && B.childrenRendered) {
            this.doSort.defer(1, this, [B])
        }
    }
};
if (Ext.dd.DropZone) {
    Ext.tree.TreeDropZone = function(A, B) {
        this.allowParentInsert = false;
        this.allowContainerDrop = false;
        this.appendOnly = false;
        Ext.tree.TreeDropZone.superclass.constructor.call(this, A.innerCt, B);
        this.tree = A;
        this.dragOverData = {};
        this.lastInsertClass = "x-tree-no-status"
    };
    Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
        ddGroup: "TreeDD",
        expandDelay: 1000,
        expandNode: function(A) {
            if (A.hasChildNodes() && !A.isExpanded()) {
                A.expand(false, null, this.triggerCacheRefresh.createDelegate(this))
            }
        },
        queueExpand: function(A) {
            this.expandProcId = this.expandNode.defer(this.expandDelay, this, [A])
        },
        cancelExpand: function() {
            if (this.expandProcId) {
                clearTimeout(this.expandProcId);
                this.expandProcId = false
            }
        },
        isValidDropPoint: function(A, I, G, D, C) {
            if (!A || !C) {
                return false
            }
            var E = A.node;
            var F = C.node;
            if (! (E && E.isTarget && I)) {
                return false
            }
            if (I == "append" && E.allowChildren === false) {
                return false
            }
            if ((I == "above" || I == "below") && (E.parentNode && E.parentNode.allowChildren === false)) {
                return false
            }
            if (F && (E == F || F.contains(E))) {
                return false
            }
            var B = this.dragOverData;
            B.tree = this.tree;
            B.target = E;
            B.data = C;
            B.point = I;
            B.source = G;
            B.rawEvent = D;
            B.dropNode = F;
            B.cancel = false;
            var H = this.tree.fireEvent("nodedragover", B);
            return B.cancel === false && H !== false
        },
        getDropPoint: function(E, D, I) {
            var J = D.node;
            if (J.isRoot) {
                return J.allowChildren !== false ? "append": false
            }
            var B = D.ddel;
            var K = Ext.lib.Dom.getY(B),
            G = K + B.offsetHeight;
            var F = Ext.lib.Event.getPageY(E);
            var H = J.allowChildren === false || J.isLeaf();
            if (this.appendOnly || J.parentNode.allowChildren === false) {
                return H ? false: "append"
            }
            var C = false;
            if (!this.allowParentInsert) {
                C = J.hasChildNodes() && J.isExpanded()
            }
            var A = (G - K) / (H ? 2 : 3);
            if (F >= K && F < (K + A)) {
                return "above"
            } else {
                if (!C && (H || F >= G - A && F <= G)) {
                    return "below"
                } else {
                    return "append"
                }
            }
        },
        onNodeEnter: function(D, A, C, B) {
            this.cancelExpand()
        },
        onNodeOver: function(B, G, F, E) {
            var I = this.getDropPoint(F, B, G);
            var C = B.node;
            if (!this.expandProcId && I == "append" && C.hasChildNodes() && !B.node.isExpanded()) {
                this.queueExpand(C)
            } else {
                if (I != "append") {
                    this.cancelExpand()
                }
            }
            var D = this.dropNotAllowed;
            if (this.isValidDropPoint(B, I, G, F, E)) {
                if (I) {
                    var A = B.ddel;
                    var H;
                    if (I == "above") {
                        D = B.node.isFirst() ? "x-tree-drop-ok-above": "x-tree-drop-ok-between";
                        H = "x-tree-drag-insert-above"
                    } else {
                        if (I == "below") {
                            D = B.node.isLast() ? "x-tree-drop-ok-below": "x-tree-drop-ok-between";
                            H = "x-tree-drag-insert-below"
                        } else {
                            D = "x-tree-drop-ok-append";
                            H = "x-tree-drag-append"
                        }
                    }
                    if (this.lastInsertClass != H) {
                        Ext.fly(A).replaceClass(this.lastInsertClass, H);
                        this.lastInsertClass = H
                    }
                }
            }
            return D
        },
        onNodeOut: function(D, A, C, B) {
            this.cancelExpand();
            this.removeDropIndicators(D)
        },
        onNodeDrop: function(C, I, E, D) {
            var H = this.getDropPoint(E, C, I);
            var F = C.node;
            F.ui.startDrop();
            if (!this.isValidDropPoint(C, H, I, E, D)) {
                F.ui.endDrop();
                return false
            }
            var G = D.node || (I.getTreeNode ? I.getTreeNode(D, F, H, E) : null);
            var B = {
                tree: this.tree,
                target: F,
                data: D,
                point: H,
                source: I,
                rawEvent: E,
                dropNode: G,
                cancel: !G,
                dropStatus: false
            };
            var A = this.tree.fireEvent("beforenodedrop", B);
            if (A === false || B.cancel === true || !B.dropNode) {
                F.ui.endDrop();
                return B.dropStatus
            }
            F = B.target;
            if (H == "append" && !F.isExpanded()) {
                F.expand(false, null,
                function() {
                    this.completeDrop(B)
                }.createDelegate(this))
            } else {
                this.completeDrop(B)
            }
            return true
        },
        completeDrop: function(G) {
            var D = G.dropNode,
            E = G.point,
            C = G.target;
            if (!Ext.isArray(D)) {
                D = [D]
            }
            var F;
            for (var B = 0, A = D.length; B < A; B++) {
                F = D[B];
                if (E == "above") {
                    C.parentNode.insertBefore(F, C)
                } else {
                    if (E == "below") {
                        C.parentNode.insertBefore(F, C.nextSibling)
                    } else {
                        C.appendChild(F)
                    }
                }
            }
            F.ui.focus();
            if (Ext.enableFx && this.tree.hlDrop) {
                F.ui.highlight()
            }
            C.ui.endDrop();
            this.tree.fireEvent("nodedrop", G)
        },
        afterNodeMoved: function(A, C, E, D, B) {
            if (Ext.enableFx && this.tree.hlDrop) {
                B.ui.focus();
                B.ui.highlight()
            }
            this.tree.fireEvent("nodedrop", this.tree, D, C, A, E)
        },
        getTree: function() {
            return this.tree
        },
        removeDropIndicators: function(B) {
            if (B && B.ddel) {
                var A = B.ddel;
                Ext.fly(A).removeClass(["x-tree-drag-insert-above", "x-tree-drag-insert-below", "x-tree-drag-append"]);
                this.lastInsertClass = "_noclass"
            }
        },
        beforeDragDrop: function(B, A, C) {
            this.cancelExpand();
            return true
        },
        afterRepair: function(A) {
            if (A && Ext.enableFx) {
                A.node.ui.highlight()
            }
            this.hideProxy()
        }
    })
};
if (Ext.dd.DragZone) {
    Ext.tree.TreeDragZone = function(A, B) {
        Ext.tree.TreeDragZone.superclass.constructor.call(this, A.getTreeEl(), B);
        this.tree = A
    };
    Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {
        ddGroup: "TreeDD",
        onBeforeDrag: function(A, B) {
            var C = A.node;
            return C && C.draggable && !C.disabled
        },
        onInitDrag: function(B) {
            var A = this.dragData;
            this.tree.getSelectionModel().select(A.node);
            this.tree.eventModel.disable();
            this.proxy.update("");
            A.node.ui.appendDDGhost(this.proxy.ghost.dom);
            this.tree.fireEvent("startdrag", this.tree, A.node, B)
        },
        getRepairXY: function(B, A) {
            return A.node.ui.getDDRepairXY()
        },
        onEndDrag: function(A, B) {
            this.tree.eventModel.enable.defer(100, this.tree.eventModel);
            this.tree.fireEvent("enddrag", this.tree, A.node, B)
        },
        onValidDrop: function(A, B, C) {
            this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, A, B);
            this.hideProxy()
        },
        beforeInvalidDrop: function(A, C) {
            var B = this.tree.getSelectionModel();
            B.clearSelections();
            B.select(this.dragData.node)
        },
        afterRepair: function() {
            if (Ext.enableFx && this.tree.hlDrop) {
                Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9")
            }
            this.dragging = false
        }
    })
};
Ext.tree.TreeEditor = function(A, C, B) {
    C = C || {};
    var D = C.events ? C: new Ext.form.TextField(C);
    Ext.tree.TreeEditor.superclass.constructor.call(this, D, B);
    this.tree = A;
    if (!A.rendered) {
        A.on("render", this.initEditor, this)
    } else {
        this.initEditor(A)
    }
};
Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
    alignment: "l-l",
    autoSize: false,
    hideEl: false,
    cls: "x-small-editor x-tree-editor",
    shim: false,
    shadow: "frame",
    maxWidth: 250,
    editDelay: 350,
    initEditor: function(A) {
        A.on("beforeclick", this.beforeNodeClick, this);
        A.on("dblclick", this.onNodeDblClick, this);
        this.on("complete", this.updateNode, this);
        this.on("beforestartedit", this.fitToTree, this);
        this.on("startedit", this.bindScroll, this, {
            delay: 10
        });
        this.on("specialkey", this.onSpecialKey, this)
    },
    fitToTree: function(B, C) {
        var E = this.tree.getTreeEl().dom,
        D = C.dom;
        if (E.scrollLeft > D.offsetLeft) {
            E.scrollLeft = D.offsetLeft
        }
        var A = Math.min(this.maxWidth, (E.clientWidth > 20 ? E.clientWidth: E.offsetWidth) - Math.max(0, D.offsetLeft - E.scrollLeft) - 5);
        this.setSize(A, "")
    },
    triggerEdit: function(A, B) {
        this.completeEdit();
        if (A.attributes.editable !== false) {
            this.editNode = A;
            if (this.tree.autoScroll) {
                A.ui.getEl().scrollIntoView(this.tree.body)
            }
            this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [A.ui.textNode, A.text]);
            return false
        }
    },
    bindScroll: function() {
        this.tree.getTreeEl().on("scroll", this.cancelEdit, this)
    },
    beforeNodeClick: function(A, B) {
        clearTimeout(this.autoEditTimer);
        if (this.tree.getSelectionModel().isSelected(A)) {
            B.stopEvent();
            return this.triggerEdit(A)
        }
    },
    onNodeDblClick: function(A, B) {
        clearTimeout(this.autoEditTimer)
    },
    updateNode: function(A, B) {
        this.tree.getTreeEl().un("scroll", this.cancelEdit, this);
        this.editNode.setText(B)
    },
    onHide: function() {
        Ext.tree.TreeEditor.superclass.onHide.call(this);
        if (this.editNode) {
            this.editNode.ui.focus.defer(50, this.editNode.ui)
        }
    },
    onSpecialKey: function(C, B) {
        var A = B.getKey();
        if (A == B.ESC) {
            B.stopEvent();
            this.cancelEdit()
        } else {
            if (A == B.ENTER && !B.hasModifier()) {
                B.stopEvent();
                this.completeEdit()
            }
        }
    }
});
Ext.menu.Menu = function(A) {
    if (Ext.isArray(A)) {
        A = {
            items: A
        }
    }
    Ext.apply(this, A);
    this.id = this.id || Ext.id();
    this.addEvents("beforeshow", "beforehide", "show", "hide", "click", "mouseover", "mouseout", "itemclick");
    Ext.menu.MenuMgr.register(this);
    Ext.menu.Menu.superclass.constructor.call(this);
    var B = this.items;
    this.items = new Ext.util.MixedCollection();
    if (B) {
        this.add.apply(this, B)
    }
};
Ext.extend(Ext.menu.Menu, Ext.util.Observable, {
    minWidth: 120,
    shadow: "sides",
    subMenuAlign: "tl-tr?",
    defaultAlign: "tl-bl?",
    allowOtherMenus: false,
    ignoreParentClicks: false,
    hidden: true,
    createEl: function() {
        return new Ext.Layer({
            cls: "x-menu",
            shadow: this.shadow,
            constrain: false,
            parentEl: this.parentEl || document.body,
            zindex: 15000
        })
    },
    render: function() {
        if (this.el) {
            return
        }
        var B = this.el = this.createEl();
        if (!this.keyNav) {
            this.keyNav = new Ext.menu.MenuNav(this)
        }
        if (this.plain) {
            B.addClass("x-menu-plain")
        }
        if (this.cls) {
            B.addClass(this.cls)
        }
        this.focusEl = B.createChild({
            tag: "a",
            cls: "x-menu-focus",
            href: "#",
            onclick: "return false;",
            tabIndex: "-1"
        });
        var A = B.createChild({
            tag: "ul",
            cls: "x-menu-list"
        });
        A.on("click", this.onClick, this);
        A.on("mouseover", this.onMouseOver, this);
        A.on("mouseout", this.onMouseOut, this);
        this.items.each(function(D) {
            var C = document.createElement("li");
            C.className = "x-menu-list-item";
            A.dom.appendChild(C);
            D.render(C, this)
        },
        this);
        this.ul = A;
        this.autoWidth()
    },
    autoWidth: function() {
        var D = this.el,
        C = this.ul;
        if (!D) {
            return
        }
        var A = this.width;
        if (A) {
            D.setWidth(A)
        } else {
            if (Ext.isIE) {
                D.setWidth(this.minWidth);
                var B = D.dom.offsetWidth;
                D.setWidth(C.getWidth() + D.getFrameWidth("lr"))
            }
        }
    },
    delayAutoWidth: function() {
        if (this.el) {
            if (!this.awTask) {
                this.awTask = new Ext.util.DelayedTask(this.autoWidth, this)
            }
            this.awTask.delay(20)
        }
    },
    findTargetItem: function(B) {
        var A = B.getTarget(".x-menu-list-item", this.ul, true);
        if (A && A.menuItemId) {
            return this.items.get(A.menuItemId)
        }
    },
    onClick: function(B) {
        var A;
        if (A = this.findTargetItem(B)) {
            if (A.menu && this.ignoreParentClicks) {
                A.expandMenu()
            } else {
                A.onClick(B);
                this.fireEvent("click", this, A, B)
            }
        }
    },
    setActiveItem: function(A, B) {
        if (A != this.activeItem) {
            if (this.activeItem) {
                this.activeItem.deactivate()
            }
            this.activeItem = A;
            A.activate(B)
        } else {
            if (B) {
                A.expandMenu()
            }
        }
    },
    tryActivate: function(F, E) {
        var B = this.items;
        for (var C = F, A = B.length; C >= 0 && C < A; C += E) {
            var D = B.get(C);
            if (!D.disabled && D.canActivate) {
                this.setActiveItem(D, false);
                return D
            }
        }
        return false
    },
    onMouseOver: function(B) {
        var A;
        if (A = this.findTargetItem(B)) {
            if (A.canActivate && !A.disabled) {
                this.setActiveItem(A, true)
            }
        }
        this.over = true;
        this.fireEvent("mouseover", this, B, A)
    },
    onMouseOut: function(B) {
        var A;
        if (A = this.findTargetItem(B)) {
            if (A == this.activeItem && A.shouldDeactivate(B)) {
                this.activeItem.deactivate();
                delete this.activeItem
            }
        }
        this.over = false;
        this.fireEvent("mouseout", this, B, A)
    },
    isVisible: function() {
        return this.el && !this.hidden
    },
    show: function(B, C, A) {
        this.parentMenu = A;
        if (!this.el) {
            this.render()
        }
        this.fireEvent("beforeshow", this);
        this.showAt(this.el.getAlignToXY(B, C || this.defaultAlign), A, false)
    },
    showAt: function(C, B, A) {
        this.parentMenu = B;
        if (!this.el) {
            this.render()
        }
        if (A !== false) {
            this.fireEvent("beforeshow", this);
            C = this.el.adjustForConstraints(C)
        }
        this.el.setXY(C);
        this.el.show();
        this.hidden = false;
        this.focus();
        this.fireEvent("show", this)
    },
    focus: function() {
        if (!this.hidden) {
            this.doFocus.defer(50, this)
        }
    },
    doFocus: function() {
        if (!this.hidden) {
            this.focusEl.focus()
        }
    },
    hide: function(A) {
        if (this.el && this.isVisible()) {
            this.fireEvent("beforehide", this);
            if (this.activeItem) {
                this.activeItem.deactivate();
                this.activeItem = null
            }
            this.el.hide();
            this.hidden = true;
            this.fireEvent("hide", this)
        }
        if (A === true && this.parentMenu) {
            this.parentMenu.hide(true)
        }
    },
    add: function() {
        var B = arguments,
        A = B.length,
        E;
        for (var C = 0; C < A; C++) {
            var D = B[C];
            if (D.render) {
                E = this.addItem(D)
            } else {
                if (typeof D == "string") {
                    if (D == "separator" || D == "-") {
                        E = this.addSeparator()
                    } else {
                        E = this.addText(D)
                    }
                } else {
                    if (D.tagName || D.el) {
                        E = this.addElement(D)
                    } else {
                        if (typeof D == "object") {
                            Ext.applyIf(D, this.defaults);
                            E = this.addMenuItem(D)
                        }
                    }
                }
            }
        }
        return E
    },
    getEl: function() {
        if (!this.el) {
            this.render()
        }
        return this.el
    },
    addSeparator: function() {
        return this.addItem(new Ext.menu.Separator())
    },
    addElement: function(A) {
        return this.addItem(new Ext.menu.BaseItem(A))
    },
    addItem: function(B) {
        this.items.add(B);
        if (this.ul) {
            var A = document.createElement("li");
            A.className = "x-menu-list-item";
            this.ul.dom.appendChild(A);
            B.render(A, this);
            this.delayAutoWidth()
        }
        return B
    },
    addMenuItem: function(A) {
        if (! (A instanceof Ext.menu.Item)) {
            if (typeof A.checked == "boolean") {
                A = new Ext.menu.CheckItem(A)
            } else {
                A = new Ext.menu.Item(A)
            }
        }
        return this.addItem(A)
    },
    addText: function(A) {
        return this.addItem(new Ext.menu.TextItem(A))
    },
    insert: function(B, C) {
        this.items.insert(B, C);
        if (this.ul) {
            var A = document.createElement("li");
            A.className = "x-menu-list-item";
            this.ul.dom.insertBefore(A, this.ul.dom.childNodes[B]);
            C.render(A, this);
            this.delayAutoWidth()
        }
        return C
    },
    remove: function(A) {
        this.items.removeKey(A.id);
        A.destroy()
    },
    removeAll: function() {
        if (this.items) {
            var A;
            while (A = this.items.first()) {
                this.remove(A)
            }
        }
    },
    destroy: function() {
        this.beforeDestroy();
        Ext.menu.MenuMgr.unregister(this);
        if (this.keyNav) {
            this.keyNav.disable()
        }
        this.removeAll();
        if (this.ul) {
            this.ul.removeAllListeners()
        }
        if (this.el) {
            this.el.destroy()
        }
    },
    beforeDestroy: Ext.emptyFn
});
Ext.menu.MenuNav = function(A) {
    Ext.menu.MenuNav.superclass.constructor.call(this, A.el);
    this.scope = this.menu = A
};
Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, {
    doRelay: function(C, B) {
        var A = C.getKey();
        if (!this.menu.activeItem && C.isNavKeyPress() && A != C.SPACE && A != C.RETURN) {
            this.menu.tryActivate(0, 1);
            return false
        }
        return B.call(this.scope || this, C, this.menu)
    },
    up: function(B, A) {
        if (!A.tryActivate(A.items.indexOf(A.activeItem) - 1, -1)) {
            A.tryActivate(A.items.length - 1, -1)
        }
    },
    down: function(B, A) {
        if (!A.tryActivate(A.items.indexOf(A.activeItem) + 1, 1)) {
            A.tryActivate(0, 1)
        }
    },
    right: function(B, A) {
        if (A.activeItem) {
            A.activeItem.expandMenu(true)
        }
    },
    left: function(B, A) {
        A.hide();
        if (A.parentMenu && A.parentMenu.activeItem) {
            A.parentMenu.activeItem.activate()
        }
    },
    enter: function(B, A) {
        if (A.activeItem) {
            B.stopPropagation();
            A.activeItem.onClick(B);
            A.fireEvent("click", this, A.activeItem);
            return true
        }
    }
});
Ext.menu.MenuMgr = function() {
    var F, D, C = {},
    A = false,
    K = new Date();
    function M() {
        F = {};
        D = new Ext.util.MixedCollection();
        Ext.getDoc().addKeyListener(27,
        function() {
            if (D.length > 0) {
                H()
            }
        })
    }
    function H() {
        if (D && D.length > 0) {
            var N = D.clone();
            N.each(function(O) {
                O.hide()
            })
        }
    }
    function E(N) {
        D.remove(N);
        if (D.length < 1) {
            Ext.getDoc().un("mousedown", L);
            A = false
        }
    }
    function J(N) {
        var O = D.last();
        K = new Date();
        D.add(N);
        if (!A) {
            Ext.getDoc().on("mousedown", L);
            A = true
        }
        if (N.parentMenu) {
            N.getEl().setZIndex(parseInt(N.parentMenu.getEl().getStyle("z-index"), 10) + 3);
            N.parentMenu.activeChild = N
        } else {
            if (O && O.isVisible()) {
                N.getEl().setZIndex(parseInt(O.getEl().getStyle("z-index"), 10) + 3)
            }
        }
    }
    function B(N) {
        if (N.activeChild) {
            N.activeChild.hide()
        }
        if (N.autoHideTimer) {
            clearTimeout(N.autoHideTimer);
            delete N.autoHideTimer
        }
    }
    function G(N) {
        var O = N.parentMenu;
        if (!O && !N.allowOtherMenus) {
            H()
        } else {
            if (O && O.activeChild) {
                O.activeChild.hide()
            }
        }
    }
    function L(N) {
        if (K.getElapsed() > 50 && D.length > 0 && !N.getTarget(".x-menu")) {
            H()
        }
    }
    function I(O, R) {
        if (R) {
            var Q = C[O.group];
            for (var P = 0, N = Q.length; P < N; P++) {
                if (Q[P] != O) {
                    Q[P].setChecked(false)
                }
            }
        }
    }
    return {
        hideAll: function() {
            H()
        },
        register: function(O) {
            if (!F) {
                M()
            }
            F[O.id] = O;
            O.on("beforehide", B);
            O.on("hide", E);
            O.on("beforeshow", G);
            O.on("show", J);
            var N = O.group;
            if (N && O.events["checkchange"]) {
                if (!C[N]) {
                    C[N] = []
                }
                C[N].push(O);
                O.on("checkchange", onCheck)
            }
        },
        get: function(N) {
            if (typeof N == "string") {
                if (!F) {
                    return null
                }
                return F[N]
            } else {
                if (N.events) {
                    return N
                } else {
                    if (typeof N.length == "number") {
                        return new Ext.menu.Menu({
                            items: N
                        })
                    } else {
                        return new Ext.menu.Menu(N)
                    }
                }
            }
        },
        unregister: function(O) {
            delete F[O.id];
            O.un("beforehide", B);
            O.un("hide", E);
            O.un("beforeshow", G);
            O.un("show", J);
            var N = O.group;
            if (N && O.events["checkchange"]) {
                C[N].remove(O);
                O.un("checkchange", onCheck)
            }
        },
        registerCheckable: function(N) {
            var O = N.group;
            if (O) {
                if (!C[O]) {
                    C[O] = []
                }
                C[O].push(N);
                N.on("beforecheckchange", I)
            }
        },
        unregisterCheckable: function(N) {
            var O = N.group;
            if (O) {
                C[O].remove(N);
                N.un("beforecheckchange", I)
            }
        },
        getCheckedItem: function(P) {
            var Q = C[P];
            if (Q) {
                for (var O = 0, N = Q.length; O < N; O++) {
                    if (Q[O].checked) {
                        return Q[O]
                    }
                }
            }
            return null
        },
        setCheckedItem: function(P, R) {
            var Q = C[P];
            if (Q) {
                for (var O = 0, N = Q.length; O < N; O++) {
                    if (Q[O].id == R) {
                        Q[O].setChecked(true)
                    }
                }
            }
            return null
        }
    }
} ();
Ext.menu.BaseItem = function(A) {
    Ext.menu.BaseItem.superclass.constructor.call(this, A);
    this.addEvents("click", "activate", "deactivate");
    if (this.handler) {
        this.on("click", this.handler, this.scope)
    }
};
Ext.extend(Ext.menu.BaseItem, Ext.Component, {
    canActivate: false,
    activeClass: "x-menu-item-active",
    hideOnClick: true,
    hideDelay: 100,
    ctype: "Ext.menu.BaseItem",
    actionMode: "container",
    render: function(A, B) {
        this.parentMenu = B;
        Ext.menu.BaseItem.superclass.render.call(this, A);
        this.container.menuItemId = this.id
    },
    onRender: function(B, A) {
        this.el = Ext.get(this.el);
        B.dom.appendChild(this.el.dom)
    },
    setHandler: function(B, A) {
        if (this.handler) {
            this.un("click", this.handler, this.scope)
        }
        this.on("click", this.handler = B, this.scope = A)
    },
    onClick: function(A) {
        if (!this.disabled && this.fireEvent("click", this, A) !== false && this.parentMenu.fireEvent("itemclick", this, A) !== false) {
            this.handleClick(A)
        } else {
            A.stopEvent()
        }
    },
    activate: function() {
        if (this.disabled) {
            return false
        }
        var A = this.container;
        A.addClass(this.activeClass);
        this.region = A.getRegion().adjust(2, 2, -2, -2);
        this.fireEvent("activate", this);
        return true
    },
    deactivate: function() {
        this.container.removeClass(this.activeClass);
        this.fireEvent("deactivate", this)
    },
    shouldDeactivate: function(A) {
        return ! this.region || !this.region.contains(A.getPoint())
    },
    handleClick: function(A) {
        if (this.hideOnClick) {
            this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true])
        }
    },
    expandMenu: function(A) {},
    hideMenu: function() {}
});
Ext.menu.TextItem = function(A) {
    if (typeof A == "string") {
        A = {
            text: A
        }
    }
    Ext.menu.TextItem.superclass.constructor.call(this, A)
};
Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, {
    hideOnClick: false,
    itemCls: "x-menu-text",
    onRender: function() {
        var A = document.createElement("span");
        A.className = this.itemCls;
        A.innerHTML = this.text;
        this.el = A;
        Ext.menu.TextItem.superclass.onRender.apply(this, arguments)
    }
});
Ext.menu.Separator = function(A) {
    Ext.menu.Separator.superclass.constructor.call(this, A)
};
Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, {
    itemCls: "x-menu-sep",
    hideOnClick: false,
    onRender: function(A) {
        var B = document.createElement("span");
        B.className = this.itemCls;
        B.innerHTML = "&#160;";
        this.el = B;
        A.addClass("x-menu-sep-li");
        Ext.menu.Separator.superclass.onRender.apply(this, arguments)
    }
});
Ext.menu.Item = function(A) {
    Ext.menu.Item.superclass.constructor.call(this, A);
    if (this.menu) {
        this.menu = Ext.menu.MenuMgr.get(this.menu)
    }
};
Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, {
    itemCls: "x-menu-item",
    canActivate: true,
    showDelay: 200,
    hideDelay: 200,
    ctype: "Ext.menu.Item",
    onRender: function(B, A) {
        var C = document.createElement("a");
        C.hideFocus = true;
        C.unselectable = "on";
        C.href = this.href || "#";
        if (this.hrefTarget) {
            C.target = this.hrefTarget
        }
        C.className = this.itemCls + (this.menu ? " x-menu-item-arrow": "") + (this.cls ? " " + this.cls: "");
        C.innerHTML = String.format("<img src=\"{0}\" class=\"x-menu-item-icon {2}\" />{1}", this.icon || Ext.BLANK_IMAGE_URL, this.itemText || this.text, this.iconCls || "");
        this.el = C;
        Ext.menu.Item.superclass.onRender.call(this, B, A)
    },
    setText: function(A) {
        this.text = A;
        if (this.rendered) {
            this.el.update(String.format("<img src=\"{0}\" class=\"x-menu-item-icon {2}\">{1}", this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || ""));
            this.parentMenu.autoWidth()
        }
    },
    setIconClass: function(A) {
        var B = this.iconCls;
        this.iconCls = A;
        if (this.rendered) {
            this.el.child("img.x-menu-item-icon").replaceClass(B, this.iconCls)
        }
    },
    handleClick: function(A) {
        if (!this.href) {
            A.stopEvent()
        }
        Ext.menu.Item.superclass.handleClick.apply(this, arguments)
    },
    activate: function(A) {
        if (Ext.menu.Item.superclass.activate.apply(this, arguments)) {
            this.focus();
            if (A) {
                this.expandMenu()
            }
        }
        return true
    },
    shouldDeactivate: function(A) {
        if (Ext.menu.Item.superclass.shouldDeactivate.call(this, A)) {
            if (this.menu && this.menu.isVisible()) {
                return ! this.menu.getEl().getRegion().contains(A.getPoint())
            }
            return true
        }
        return false
    },
    deactivate: function() {
        Ext.menu.Item.superclass.deactivate.apply(this, arguments);
        this.hideMenu()
    },
    expandMenu: function(A) {
        if (!this.disabled && this.menu) {
            clearTimeout(this.hideTimer);
            delete this.hideTimer;
            if (!this.menu.isVisible() && !this.showTimer) {
                this.showTimer = this.deferExpand.defer(this.showDelay, this, [A])
            } else {
                if (this.menu.isVisible() && A) {
                    this.menu.tryActivate(0, 1)
                }
            }
        }
    },
    deferExpand: function(A) {
        delete this.showTimer;
        this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);
        if (A) {
            this.menu.tryActivate(0, 1)
        }
    },
    hideMenu: function() {
        clearTimeout(this.showTimer);
        delete this.showTimer;
        if (!this.hideTimer && this.menu && this.menu.isVisible()) {
            this.hideTimer = this.deferHide.defer(this.hideDelay, this)
        }
    },
    deferHide: function() {
        delete this.hideTimer;
        if (this.menu.over) {
            this.parentMenu.setActiveItem(this, false)
        } else {
            this.menu.hide()
        }
    }
});
Ext.menu.CheckItem = function(A) {
    Ext.menu.CheckItem.superclass.constructor.call(this, A);
    this.addEvents("beforecheckchange", "checkchange");
    if (this.checkHandler) {
        this.on("checkchange", this.checkHandler, this.scope)
    }
    Ext.menu.MenuMgr.registerCheckable(this)
};
Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, {
    itemCls: "x-menu-item x-menu-check-item",
    groupClass: "x-menu-group-item",
    checked: false,
    ctype: "Ext.menu.CheckItem",
    onRender: function(A) {
        Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
        if (this.group) {
            this.el.addClass(this.groupClass)
        }
        if (this.checked) {
            this.checked = false;
            this.setChecked(true, true)
        }
    },
    destroy: function() {
        Ext.menu.MenuMgr.unregisterCheckable(this);
        Ext.menu.CheckItem.superclass.destroy.apply(this, arguments)
    },
    setChecked: function(B, A) {
        if (this.checked != B && this.fireEvent("beforecheckchange", this, B) !== false) {
            if (this.container) {
                this.container[B ? "addClass": "removeClass"]("x-menu-item-checked")
            }
            this.checked = B;
            if (A !== true) {
                this.fireEvent("checkchange", this, B)
            }
        }
    },
    handleClick: function(A) {
        if (!this.disabled && !(this.checked && this.group)) {
            this.setChecked(!this.checked)
        }
        Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments)
    }
});
Ext.menu.Adapter = function(B, A) {
    Ext.menu.Adapter.superclass.constructor.call(this, A);
    this.component = B
};
Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, {
    canActivate: true,
    onRender: function(B, A) {
        this.component.render(B);
        this.el = this.component.getEl()
    },
    activate: function() {
        if (this.disabled) {
            return false
        }
        this.component.focus();
        this.fireEvent("activate", this);
        return true
    },
    deactivate: function() {
        this.fireEvent("deactivate", this)
    },
    disable: function() {
        this.component.disable();
        Ext.menu.Adapter.superclass.disable.call(this)
    },
    enable: function() {
        this.component.enable();
        Ext.menu.Adapter.superclass.enable.call(this)
    }
});
Ext.menu.DateItem = function(A) {
    Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(A), A);
    this.picker = this.component;
    this.addEvents("select");
    this.picker.on("render",
    function(B) {
        B.getEl().swallowEvent("click");
        B.container.addClass("x-menu-date-item")
    });
    this.picker.on("select", this.onSelect, this)
};
Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, {
    onSelect: function(B, A) {
        this.fireEvent("select", this, A, B);
        Ext.menu.DateItem.superclass.handleClick.call(this)
    }
});
Ext.menu.ColorItem = function(A) {
    Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(A), A);
    this.palette = this.component;
    this.relayEvents(this.palette, ["select"]);
    if (this.selectHandler) {
        this.on("select", this.selectHandler, this.scope)
    }
};
Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter);
Ext.menu.DateMenu = function(A) {
    Ext.menu.DateMenu.superclass.constructor.call(this, A);
    this.plain = true;
    var B = new Ext.menu.DateItem(A);
    this.add(B);
    this.picker = B.picker;
    this.relayEvents(B, ["select"]);
    this.on("beforeshow",
    function() {
        if (this.picker) {
            this.picker.hideMonthPicker(true)
        }
    },
    this)
};
Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu, {
    cls: "x-date-menu",
    beforeDestroy: function() {
        this.picker.destroy()
    }
});
Ext.menu.ColorMenu = function(A) {
    Ext.menu.ColorMenu.superclass.constructor.call(this, A);
    this.plain = true;
    var B = new Ext.menu.ColorItem(A);
    this.add(B);
    this.palette = B.palette;
    this.relayEvents(B, ["select"])
};
Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu);
Ext.form.Field = Ext.extend(Ext.BoxComponent, {
    invalidClass: "x-form-invalid",
    invalidText: "The value in this field is invalid",
    focusClass: "x-form-focus",
    validationEvent: "keyup",
    validateOnBlur: true,
    validationDelay: 250,
    defaultAutoCreate: {
        tag: "input",
        type: "text",
        size: "20",
        autocomplete: "off"
    },
    fieldClass: "x-form-field",
    msgTarget: "qtip",
    msgFx: "normal",
    readOnly: false,
    disabled: false,
    isFormField: true,
    hasFocus: false,
    initComponent: function() {
        Ext.form.Field.superclass.initComponent.call(this);
        this.addEvents("focus", "blur", "specialkey", "change", "invalid", "valid")
    },
    getName: function() {
        return this.rendered && this.el.dom.name ? this.el.dom.name: (this.hiddenName || "")
    },
    onRender: function(C, A) {
        Ext.form.Field.superclass.onRender.call(this, C, A);
        if (!this.el) {
            var B = this.getAutoCreate();
            if (!B.name) {
                B.name = this.name || this.id
            }
            if (this.inputType) {
                B.type = this.inputType
            }
            this.el = C.createChild(B, A)
        }
        var D = this.el.dom.type;
        if (D) {
            if (D == "password") {
                D = "text"
            }
            this.el.addClass("x-form-" + D)
        }
        if (this.readOnly) {
            this.el.dom.readOnly = true
        }
        if (this.tabIndex !== undefined) {
            this.el.dom.setAttribute("tabIndex", this.tabIndex)
        }
        this.el.addClass([this.fieldClass, this.cls])
    },
    initValue: function() {
        if (this.value !== undefined) {
            this.setValue(this.value)
        } else {
            if (this.el.dom.value.length > 0 && this.el.dom.value != this.emptyText) {
                this.setValue(this.el.dom.value)
            }
        }
        this.originalValue = this.getValue()
    },
    isDirty: function() {
        if (this.disabled) {
            return false
        }
        return String(this.getValue()) !== String(this.originalValue)
    },
    afterRender: function() {
        Ext.form.Field.superclass.afterRender.call(this);
        this.initEvents();
        this.initValue()
    },
    fireKey: function(A) {
        if (A.isSpecialKey()) {
            this.fireEvent("specialkey", this, A)
        }
    },
    reset: function() {
        this.setValue(this.originalValue);
        this.clearInvalid()
    },
    initEvents: function() {
        this.el.on(Ext.isIE || Ext.isSafari3 ? "keydown": "keypress", this.fireKey, this);
        this.el.on("focus", this.onFocus, this);
        var A = this.inEditor && Ext.isWindows && Ext.isGecko ? {
            buffer: 10
        }: null;
        this.el.on("blur", this.onBlur, this, A);
        this.originalValue = this.getValue()
    },
    onFocus: function() {
        if (!Ext.isOpera && this.focusClass) {
            this.el.addClass(this.focusClass)
        }
        if (!this.hasFocus) {
            this.hasFocus = true;
            this.startValue = this.getValue();
            this.fireEvent("focus", this)
        }
    },
    beforeBlur: Ext.emptyFn,
    onBlur: function() {
        this.beforeBlur();
        if (!Ext.isOpera && this.focusClass) {
            this.el.removeClass(this.focusClass)
        }
        this.hasFocus = false;
        if (this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur") {
            this.validate()
        }
        var A = this.getValue();
        if (String(A) !== String(this.startValue)) {
            this.fireEvent("change", this, A, this.startValue)
        }
        this.fireEvent("blur", this)
    },
    isValid: function(A) {
        if (this.disabled) {
            return true
        }
        var C = this.preventMark;
        this.preventMark = A === true;
        var B = this.validateValue(this.processValue(this.getRawValue()));
        this.preventMark = C;
        return B
    },
    validate: function() {
        if (this.disabled || this.validateValue(this.processValue(this.getRawValue()))) {
            this.clearInvalid();
            return true
        }
        return false
    },
    processValue: function(A) {
        return A
    },
    validateValue: function(A) {
        return true
    },
    markInvalid: function(C) {
        if (!this.rendered || this.preventMark) {
            return
        }
        this.el.addClass(this.invalidClass);
        C = C || this.invalidText;
        switch (this.msgTarget) {
        case "qtip":
            this.el.dom.qtip = C;
            this.el.dom.qclass = "x-form-invalid-tip";
            if (Ext.QuickTips) {
                Ext.QuickTips.enable()
            }
            break;
        case "title":
            this.el.dom.title = C;
            break;
        case "under":
            if (!this.errorEl) {
                var B = this.getErrorCt();
                if (!B) {
                    this.el.dom.title = C;
                    break
                }
                this.errorEl = B.createChild({
                    cls: "x-form-invalid-msg"
                });
                this.errorEl.setWidth(B.getWidth(true) - 20)
            }
            this.errorEl.update(C);
            Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);
            break;
        case "side":
            if (!this.errorIcon) {
                var B = this.getErrorCt();
                if (!B) {
                    this.el.dom.title = C;
                    break
                }
                this.errorIcon = B.createChild({
                    cls: "x-form-invalid-icon"
                })
            }
            this.alignErrorIcon();
            this.errorIcon.dom.qtip = C;
            this.errorIcon.dom.qclass = "x-form-invalid-tip";
            this.errorIcon.show();
            this.on("resize", this.alignErrorIcon, this);
            break;
        default:
            var A = Ext.getDom(this.msgTarget);
            A.innerHTML = C;
            A.style.display = this.msgDisplay;
            break
        }
        this.fireEvent("invalid", this, C)
    },
    getErrorCt: function() {
        return this.el.findParent(".x-form-element", 5, true) || this.el.findParent(".x-form-field-wrap", 5, true)
    },
    alignErrorIcon: function() {
        this.errorIcon.alignTo(this.el, "tl-tr", [2, 0])
    },
    clearInvalid: function() {
        if (!this.rendered || this.preventMark) {
            return
        }
        this.el.removeClass(this.invalidClass);
        switch (this.msgTarget) {
        case "qtip":
            this.el.dom.qtip = "";
            break;
        case "title":
            this.el.dom.title = "";
            break;
        case "under":
            if (this.errorEl) {
                Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this)
            }
            break;
        case "side":
            if (this.errorIcon) {
                this.errorIcon.dom.qtip = "";
                this.errorIcon.hide();
                this.un("resize", this.alignErrorIcon, this)
            }
            break;
        default:
            var A = Ext.getDom(this.msgTarget);
            A.innerHTML = "";
            A.style.display = "none";
            break
        }
        this.fireEvent("valid", this)
    },
    getRawValue: function() {
        var A = this.rendered ? this.el.getValue() : Ext.value(this.value, "");
        if (A === this.emptyText) {
            A = ""
        }
        return A
    },
    getValue: function() {
        if (!this.rendered) {
            return this.value
        }
        var A = this.el.getValue();
        if (A === this.emptyText || A === undefined) {
            A = ""
        }
        return A
    },
    setRawValue: function(A) {
        return this.el.dom.value = (A === null || A === undefined ? "": A)
    },
    setValue: function(A) {
        this.value = A;
        if (this.rendered) {
            this.el.dom.value = (A === null || A === undefined ? "": A);
            this.validate()
        }
    },
    adjustSize: function(A, C) {
        var B = Ext.form.Field.superclass.adjustSize.call(this, A, C);
        B.width = this.adjustWidth(this.el.dom.tagName, B.width);
        return B
    },
    adjustWidth: function(A, B) {
        A = A.toLowerCase();
        if (typeof B == "number" && !Ext.isSafari) {
            if (Ext.isIE && (A == "input" || A == "textarea")) {
                if (A == "input" && !Ext.isStrict) {
                    return this.inEditor ? B: B - 3
                }
                if (A == "input" && Ext.isStrict) {
                    return B - (Ext.isIE6 ? 4 : 1)
                }
                if (A == "textarea" && Ext.isStrict) {
                    return B - 2
                }
            } else {
                if (Ext.isOpera && Ext.isStrict) {
                    if (A == "input") {
                        return B + 2
                    }
                    if (A == "textarea") {
                        return B - 2
                    }
                }
            }
        }
        return B
    }
});
Ext.form.MessageTargets = {
    "qtip": {
        mark: function(A) {
            this.el.dom.qtip = msg;
            this.el.dom.qclass = "x-form-invalid-tip";
            if (Ext.QuickTips) {
                Ext.QuickTips.enable()
            }
        },
        clear: function(A) {
            this.el.dom.qtip = ""
        }
    },
    "title": {
        mark: function(A) {
            this.el.dom.title = msg
        },
        clear: function(A) {
            this.el.dom.title = ""
        }
    },
    "under": {
        mark: function(B) {
            if (!this.errorEl) {
                var A = this.getErrorCt();
                if (!A) {
                    this.el.dom.title = msg;
                    return
                }
                this.errorEl = A.createChild({
                    cls: "x-form-invalid-msg"
                });
                this.errorEl.setWidth(A.getWidth(true) - 20)
            }
            this.errorEl.update(msg);
            Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this)
        },
        clear: function(A) {
            if (this.errorEl) {
                Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this)
            } else {
                this.el.dom.title = ""
            }
        }
    },
    "side": {
        mark: function(B) {
            if (!this.errorIcon) {
                var A = this.getErrorCt();
                if (!A) {
                    this.el.dom.title = msg;
                    return
                }
                this.errorIcon = A.createChild({
                    cls: "x-form-invalid-icon"
                })
            }
            this.alignErrorIcon();
            this.errorIcon.dom.qtip = msg;
            this.errorIcon.dom.qclass = "x-form-invalid-tip";
            this.errorIcon.show();
            this.on("resize", this.alignErrorIcon, this)
        },
        clear: function(A) {
            if (this.errorIcon) {
                this.errorIcon.dom.qtip = "";
                this.errorIcon.hide();
                this.un("resize", this.alignErrorIcon, this)
            } else {
                this.el.dom.title = ""
            }
        }
    },
    "around": {
        mark: function(A) {},
        clear: function(A) {}
    }
};
Ext.form.Field.msgFx = {
    normal: {
        show: function(A, B) {
            A.setDisplayed("block")
        },
        hide: function(A, B) {
            A.setDisplayed(false).update("")
        }
    },
    slide: {
        show: function(A, B) {
            A.slideIn("t", {
                stopFx: true
            })
        },
        hide: function(A, B) {
            A.slideOut("t", {
                stopFx: true,
                useDisplay: true
            })
        }
    },
    slideRight: {
        show: function(A, B) {
            A.fixDisplay();
            A.alignTo(B.el, "tl-tr");
            A.slideIn("l", {
                stopFx: true
            })
        },
        hide: function(A, B) {
            A.slideOut("l", {
                stopFx: true,
                useDisplay: true
            })
        }
    }
};
Ext.reg("field", Ext.form.Field);
Ext.form.TextField = Ext.extend(Ext.form.Field, {
    grow: false,
    growMin: 30,
    growMax: 800,
    vtype: null,
    maskRe: null,
    disableKeyFilter: false,
    allowBlank: true,
    minLength: 0,
    maxLength: Number.MAX_VALUE,
    minLengthText: "The minimum length for this field is {0}",
    maxLengthText: "The maximum length for this field is {0}",
    selectOnFocus: false,
    blankText: "This field is required",
    validator: null,
    regex: null,
    regexText: "",
    emptyText: null,
    emptyClass: "x-form-empty-field",
    initComponent: function() {
        Ext.form.TextField.superclass.initComponent.call(this);
        this.addEvents("autosize", "keydown", "keyup", "keypress")
    },
    initEvents: function() {
        Ext.form.TextField.superclass.initEvents.call(this);
        if (this.validationEvent == "keyup") {
            this.validationTask = new Ext.util.DelayedTask(this.validate, this);
            this.el.on("keyup", this.filterValidation, this)
        } else {
            if (this.validationEvent !== false) {
                this.el.on(this.validationEvent, this.validate, this, {
                    buffer: this.validationDelay
                })
            }
        }
        if (this.selectOnFocus || this.emptyText) {
            this.on("focus", this.preFocus, this);
            this.el.on("mousedown",
            function() {
                if (!this.hasFocus) {
                    this.el.on("mouseup",
                    function(A) {
                        A.preventDefault()
                    },
                    this, {
                        single: true
                    })
                }
            },
            this);
            if (this.emptyText) {
                this.on("blur", this.postBlur, this);
                this.applyEmptyText()
            }
        }
        if (this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype + "Mask"]))) {
            this.el.on("keypress", this.filterKeys, this)
        }
        if (this.grow) {
            this.el.on("keyup", this.onKeyUpBuffered, this, {
                buffer: 50
            });
            this.el.on("click", this.autoSize, this)
        }
        if (this.enableKeyEvents) {
            this.el.on("keyup", this.onKeyUp, this);
            this.el.on("keydown", this.onKeyDown, this);
            this.el.on("keypress", this.onKeyPress, this)
        }
    },
    processValue: function(A) {
        if (this.stripCharsRe) {
            var B = A.replace(this.stripCharsRe, "");
            if (B !== A) {
                this.setRawValue(B);
                return B
            }
        }
        return A
    },
    filterValidation: function(A) {
        if (!A.isNavKeyPress()) {
            this.validationTask.delay(this.validationDelay)
        }
    },
    onKeyUpBuffered: function(A) {
        if (!A.isNavKeyPress()) {
            this.autoSize()
        }
    },
    onKeyUp: function(A) {
        this.fireEvent("keyup", this, A)
    },
    onKeyDown: function(A) {
        this.fireEvent("keydown", this, A)
    },
    onKeyPress: function(A) {
        this.fireEvent("keypress", this, A)
    },
    reset: function() {
        Ext.form.TextField.superclass.reset.call(this);
        this.applyEmptyText()
    },
    applyEmptyText: function() {
        if (this.rendered && this.emptyText && this.getRawValue().length < 1) {
            this.setRawValue(this.emptyText);
            this.el.addClass(this.emptyClass)
        }
    },
    preFocus: function() {
        if (this.emptyText) {
            if (this.el.dom.value == this.emptyText) {
                this.setRawValue("")
            }
            this.el.removeClass(this.emptyClass)
        }
        if (this.selectOnFocus) {
            this.el.dom.select()
        }
    },
    postBlur: function() {
        this.applyEmptyText()
    },
    filterKeys: function(B) {
        if (B.ctrlKey) {
            return
        }
        var A = B.getKey();
        if (Ext.isGecko && (B.isNavKeyPress() || A == B.BACKSPACE || (A == B.DELETE && B.button == -1))) {
            return
        }
        var D = B.getCharCode(),
        C = String.fromCharCode(D);
        if (!Ext.isGecko && B.isSpecialKey() && !C) {
            return
        }
        if (!this.maskRe.test(C)) {
            B.stopEvent()
        }
    },
    setValue: function(A) {
        if (this.emptyText && this.el && A !== undefined && A !== null && A !== "") {
            this.el.removeClass(this.emptyClass)
        }
        Ext.form.TextField.superclass.setValue.apply(this, arguments);
        this.applyEmptyText();
        this.autoSize()
    },
    validateValue: function(A) {
        if (A.length < 1 || A === this.emptyText) {
            if (this.allowBlank) {
                this.clearInvalid();
                return true
            } else {
                this.markInvalid(this.blankText);
                return false
            }
        }
        if (A.length < this.minLength) {
            this.markInvalid(String.format(this.minLengthText, this.minLength));
            return false
        }
        if (A.length > this.maxLength) {
            this.markInvalid(String.format(this.maxLengthText, this.maxLength));
            return false
        }
        if (this.vtype) {
            var C = Ext.form.VTypes;
            if (!C[this.vtype](A, this)) {
                this.markInvalid(this.vtypeText || C[this.vtype + "Text"]);
                return false
            }
        }
        if (typeof this.validator == "function") {
            var B = this.validator(A);
            if (B !== true) {
                this.markInvalid(B);
                return false
            }
        }
        if (this.regex && !this.regex.test(A)) {
            this.markInvalid(this.regexText);
            return false
        }
        return true
    },
    selectText: function(E, A) {
        var C = this.getRawValue();
        if (C.length > 0) {
            E = E === undefined ? 0 : E;
            A = A === undefined ? C.length: A;
            var D = this.el.dom;
            if (D.setSelectionRange) {
                D.setSelectionRange(E, A)
            } else {
                if (D.createTextRange) {
                    var B = D.createTextRange();
                    B.moveStart("character", E);
                    B.moveEnd("character", A - C.length);
                    B.select()
                }
            }
        }
    },
    autoSize: function() {
        if (!this.grow || !this.rendered) {
            return
        }
        if (!this.metrics) {
            this.metrics = Ext.util.TextMetrics.createInstance(this.el)
        }
        var C = this.el;
        var B = C.dom.value;
        var D = document.createElement("div");
        D.appendChild(document.createTextNode(B));
        B = D.innerHTML;
        D = null;
        B += "&#160;";
        var A = Math.min(this.growMax, Math.max(this.metrics.getWidth(B) + 10, this.growMin));
        this.el.setWidth(A);
        this.fireEvent("autosize", this, A)
    }
});
Ext.reg("textfield", Ext.form.TextField);
Ext.form.TriggerField = Ext.extend(Ext.form.TextField, {
    defaultAutoCreate: {
        tag: "input",
        type: "text",
        size: "16",
        autocomplete: "off"
    },
    hideTrigger: false,
    autoSize: Ext.emptyFn,
    monitorTab: true,
    deferHeight: true,
    mimicing: false,
    onResize: function(A, B) {
        Ext.form.TriggerField.superclass.onResize.call(this, A, B);
        if (typeof A == "number") {
            this.el.setWidth(this.adjustWidth("input", A - this.trigger.getWidth()))
        }
        this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth())
    },
    adjustSize: Ext.BoxComponent.prototype.adjustSize,
    getResizeEl: function() {
        return this.wrap
    },
    getPositionEl: function() {
        return this.wrap
    },
    alignErrorIcon: function() {
        if (this.wrap) {
            this.errorIcon.alignTo(this.wrap, "tl-tr", [2, 0])
        }
    },
    onRender: function(B, A) {
        Ext.form.TriggerField.superclass.onRender.call(this, B, A);
        this.wrap = this.el.wrap({
            cls: "x-form-field-wrap"
        });
        this.trigger = this.wrap.createChild(this.triggerConfig || {
            tag: "img",
            src: Ext.BLANK_IMAGE_URL,
            cls: "x-form-trigger " + this.triggerClass
        });
        if (this.hideTrigger) {
            this.trigger.setDisplayed(false)
        }
        this.initTrigger();
        if (!this.width) {
            this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth())
        }
    },
    afterRender: function() {
        Ext.form.TriggerField.superclass.afterRender.call(this);
        var A;
        if (Ext.isIE && this.el.getY() != (A = this.trigger.getY())) {
            this.el.position();
            this.el.setY(A)
        }
    },
    initTrigger: function() {
        this.trigger.on("click", this.onTriggerClick, this, {
            preventDefault: true
        });
        this.trigger.addClassOnOver("x-form-trigger-over");
        this.trigger.addClassOnClick("x-form-trigger-click")
    },
    onDestroy: function() {
        if (this.trigger) {
            this.trigger.removeAllListeners();
            this.trigger.remove()
        }
        if (this.wrap) {
            this.wrap.remove()
        }
        Ext.form.TriggerField.superclass.onDestroy.call(this)
    },
    onFocus: function() {
        Ext.form.TriggerField.superclass.onFocus.call(this);
        if (!this.mimicing) {
            this.wrap.addClass("x-trigger-wrap-focus");
            this.mimicing = true;
            Ext.get(Ext.isIE ? document.body: document).on("mousedown", this.mimicBlur, this, {
                delay: 10
            });
            if (this.monitorTab) {
                this.el.on("keydown", this.checkTab, this)
            }
        }
    },
    checkTab: function(A) {
        if (A.getKey() == A.TAB) {
            this.triggerBlur()
        }
    },
    onBlur: function() {},
    mimicBlur: function(A) {
        if (!this.wrap.contains(A.target) && this.validateBlur(A)) {
            this.triggerBlur()
        }
    },
    triggerBlur: function() {
        this.mimicing = false;
        Ext.get(Ext.isIE ? document.body: document).un("mousedown", this.mimicBlur, this);
        if (this.monitorTab) {
            this.el.un("keydown", this.checkTab, this)
        }
        this.beforeBlur();
        this.wrap.removeClass("x-trigger-wrap-focus");
        Ext.form.TriggerField.superclass.onBlur.call(this)
    },
    beforeBlur: Ext.emptyFn,
    validateBlur: function(A) {
        return true
    },
    onDisable: function() {
        Ext.form.TriggerField.superclass.onDisable.call(this);
        if (this.wrap) {
            this.wrap.addClass(this.disabledClass);
            this.el.removeClass(this.disabledClass)
        }
    },
    onEnable: function() {
        Ext.form.TriggerField.superclass.onEnable.call(this);
        if (this.wrap) {
            this.wrap.removeClass(this.disabledClass)
        }
    },
    onShow: function() {
        if (this.wrap) {
            this.wrap.dom.style.display = "";
            this.wrap.dom.style.visibility = "visible"
        }
    },
    onHide: function() {
        this.wrap.dom.style.display = "none"
    },
    onTriggerClick: Ext.emptyFn
});
Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {
    initComponent: function() {
        Ext.form.TwinTriggerField.superclass.initComponent.call(this);
        this.triggerConfig = {
            tag: "span",
            cls: "x-form-twin-triggers",
            cn: [{
                tag: "img",
                src: Ext.BLANK_IMAGE_URL,
                cls: "x-form-trigger " + this.trigger1Class
            },
            {
                tag: "img",
                src: Ext.BLANK_IMAGE_URL,
                cls: "x-form-trigger " + this.trigger2Class
            }]
        }
    },
    getTrigger: function(A) {
        return this.triggers[A]
    },
    initTrigger: function() {
        var A = this.trigger.select(".x-form-trigger", true);
        this.wrap.setStyle("overflow", "hidden");
        var B = this;
        A.each(function(D, F, C) {
            D.hide = function() {
                var G = B.wrap.getWidth();
                this.dom.style.display = "none";
                B.el.setWidth(G - B.trigger.getWidth())
            };
            D.show = function() {
                var G = B.wrap.getWidth();
                this.dom.style.display = "";
                B.el.setWidth(G - B.trigger.getWidth())
            };
            var E = "Trigger" + (C + 1);
            if (this["hide" + E]) {
                D.dom.style.display = "none"
            }
            D.on("click", this["on" + E + "Click"], this, {
                preventDefault: true
            });
            D.addClassOnOver("x-form-trigger-over");
            D.addClassOnClick("x-form-trigger-click")
        },
        this);
        this.triggers = A.elements
    },
    onTrigger1Click: Ext.emptyFn,
    onTrigger2Click: Ext.emptyFn
});
Ext.reg("trigger", Ext.form.TriggerField);
Ext.form.TextArea = Ext.extend(Ext.form.TextField, {
    growMin: 60,
    growMax: 1000,
    growAppend: "&#160;\n&#160;",
    growPad: 0,
    enterIsSpecial: false,
    preventScrollbars: false,
    onRender: function(B, A) {
        if (!this.el) {
            this.defaultAutoCreate = {
                tag: "textarea",
                style: "width:100px;height:60px;",
                autocomplete: "off"
            }
        }
        Ext.form.TextArea.superclass.onRender.call(this, B, A);
        if (this.grow) {
            this.textSizeEl = Ext.DomHelper.append(document.body, {
                tag: "pre",
                cls: "x-form-grow-sizer"
            });
            if (this.preventScrollbars) {
                this.el.setStyle("overflow", "hidden")
            }
            this.el.setHeight(this.growMin)
        }
    },
    onDestroy: function() {
        if (this.textSizeEl) {
            Ext.removeNode(this.textSizeEl)
        }
        Ext.form.TextArea.superclass.onDestroy.call(this)
    },
    fireKey: function(A) {
        if (A.isSpecialKey() && (this.enterIsSpecial || (A.getKey() != A.ENTER || A.hasModifier()))) {
            this.fireEvent("specialkey", this, A)
        }
    },
    onKeyUp: function(A) {
        if (!A.isNavKeyPress() || A.getKey() == A.ENTER) {
            this.autoSize()
        }
        Ext.form.TextArea.superclass.onKeyUp.call(this, A)
    },
    autoSize: function() {
        if (!this.grow || !this.textSizeEl) {
            return
        }
        var C = this.el;
        var A = C.dom.value;
        var D = this.textSizeEl;
        D.innerHTML = "";
        D.appendChild(document.createTextNode(A));
        A = D.innerHTML;
        Ext.fly(D).setWidth(this.el.getWidth());
        if (A.length < 1) {
            A = "&#160;&#160;"
        } else {
            if (Ext.isIE) {
                A = A.replace(/\n/g, "<p>&#160;</p>")
            }
            A += this.growAppend
        }
        D.innerHTML = A;
        var B = Math.min(this.growMax, Math.max(D.offsetHeight, this.growMin) + this.growPad);
        if (B != this.lastHeight) {
            this.lastHeight = B;
            this.el.setHeight(B);
            this.fireEvent("autosize", this, B)
        }
    }
});
Ext.reg("textarea", Ext.form.TextArea);
Ext.form.NumberField = Ext.extend(Ext.form.TextField, {
    fieldClass: "x-form-field x-form-num-field",
    allowDecimals: true,
    decimalSeparator: ".",
    decimalPrecision: 2,
    allowNegative: true,
    minValue: Number.NEGATIVE_INFINITY,
    maxValue: Number.MAX_VALUE,
    minText: "The minimum value for this field is {0}",
    maxText: "The maximum value for this field is {0}",
    nanText: "{0} is not a valid number",
    baseChars: "0123456789",
    initEvents: function() {
        Ext.form.NumberField.superclass.initEvents.call(this);
        var B = this.baseChars + "";
        if (this.allowDecimals) {
            B += this.decimalSeparator
        }
        if (this.allowNegative) {
            B += "-"
        }
        this.stripCharsRe = new RegExp("[^" + B + "]", "gi");
        var A = function(D) {
            var C = D.getKey();
            if (!Ext.isIE && (D.isSpecialKey() || C == D.BACKSPACE || C == D.DELETE)) {
                return
            }
            var E = D.getCharCode();
            if (B.indexOf(String.fromCharCode(E)) === -1) {
                D.stopEvent()
            }
        };
        this.el.on("keypress", A, this)
    },
    validateValue: function(B) {
        if (!Ext.form.NumberField.superclass.validateValue.call(this, B)) {
            return false
        }
        if (B.length < 1) {
            return true
        }
        B = String(B).replace(this.decimalSeparator, ".");
        if (isNaN(B)) {
            this.markInvalid(String.format(this.nanText, B));
            return false
        }
        var A = this.parseValue(B);
        if (A < this.minValue) {
            this.markInvalid(String.format(this.minText, this.minValue));
            return false
        }
        if (A > this.maxValue) {
            this.markInvalid(String.format(this.maxText, this.maxValue));
            return false
        }
        return true
    },
    getValue: function() {
        return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))
    },
    setValue: function(A) {
        A = typeof A == "number" ? A: parseFloat(String(A).replace(this.decimalSeparator, "."));
        A = isNaN(A) ? "": String(A).replace(".", this.decimalSeparator);
        Ext.form.NumberField.superclass.setValue.call(this, A)
    },
    parseValue: function(A) {
        A = parseFloat(String(A).replace(this.decimalSeparator, "."));
        return isNaN(A) ? "": A
    },
    fixPrecision: function(B) {
        var A = isNaN(B);
        if (!this.allowDecimals || this.decimalPrecision == -1 || A || !B) {
            return A ? "": B
        }
        return parseFloat(parseFloat(B).toFixed(this.decimalPrecision))
    },
    beforeBlur: function() {
        var A = this.parseValue(this.getRawValue());
        if (A) {
            this.setValue(this.fixPrecision(A))
        }
    }
});
Ext.reg("numberfield", Ext.form.NumberField);
Ext.form.DateField = Ext.extend(Ext.form.TriggerField, {
    format: "m/d/Y",
    altFormats: "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",
    disabledDaysText: "Disabled",
    disabledDatesText: "Disabled",
    minText: "The date in this field must be equal to or after {0}",
    maxText: "The date in this field must be equal to or before {0}",
    invalidText: "{0} is not a valid date - it must be in the format {1}",
    triggerClass: "x-form-date-trigger",
    showToday: true,
    defaultAutoCreate: {
        tag: "input",
        type: "text",
        size: "10",
        autocomplete: "off"
    },
    initComponent: function() {
        Ext.form.DateField.superclass.initComponent.call(this);
        if (typeof this.minValue == "string") {
            this.minValue = this.parseDate(this.minValue)
        }
        if (typeof this.maxValue == "string") {
            this.maxValue = this.parseDate(this.maxValue)
        }
        this.ddMatch = null;
        this.initDisabledDays()
    },
    initDisabledDays: function() {
        if (this.disabledDates) {
            var A = this.disabledDates;
            var C = "(?:";
            for (var B = 0; B < A.length; B++) {
                C += A[B];
                if (B != A.length - 1) {
                    C += "|"
                }
            }
            this.disabledDatesRE = new RegExp(C + ")")
        }
    },
    setDisabledDates: function(A) {
        this.disabledDates = A;
        this.initDisabledDays();
        if (this.menu) {
            this.menu.picker.setDisabledDates(this.disabledDatesRE)
        }
    },
    setDisabledDays: function(A) {
        this.disabledDays = A;
        if (this.menu) {
            this.menu.picker.setDisabledDays(A)
        }
    },
    setMinValue: function(A) {
        this.minValue = (typeof A == "string" ? this.parseDate(A) : A);
        if (this.menu) {
            this.menu.picker.setMinDate(this.minValue)
        }
    },
    setMaxValue: function(A) {
        this.maxValue = (typeof A == "string" ? this.parseDate(A) : A);
        if (this.menu) {
            this.menu.picker.setMaxDate(this.maxValue)
        }
    },
    validateValue: function(E) {
        E = this.formatDate(E);
        if (!Ext.form.DateField.superclass.validateValue.call(this, E)) {
            return false
        }
        if (E.length < 1) {
            return true
        }
        var C = E;
        E = this.parseDate(E);
        if (!E) {
            this.markInvalid(String.format(this.invalidText, C, this.format));
            return false
        }
        var F = E.getTime();
        if (this.minValue && F < this.minValue.getTime()) {
            this.markInvalid(String.format(this.minText, this.formatDate(this.minValue)));
            return false
        }
        if (this.maxValue && F > this.maxValue.getTime()) {
            this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue)));
            return false
        }
        if (this.disabledDays) {
            var A = E.getDay();
            for (var B = 0; B < this.disabledDays.length; B++) {
                if (A === this.disabledDays[B]) {
                    this.markInvalid(this.disabledDaysText);
                    return false
                }
            }
        }
        var D = this.formatDate(E);
        if (this.ddMatch && this.ddMatch.test(D)) {
            this.markInvalid(String.format(this.disabledDatesText, D));
            return false
        }
        return true
    },
    validateBlur: function() {
        return ! this.menu || !this.menu.isVisible()
    },
    getValue: function() {
        return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""
    },
    setValue: function(A) {
        Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(A)))
    },
    parseDate: function(D) {
        if (!D || Ext.isDate(D)) {
            return D
        }
        var B = Date.parseDate(D, this.format);
        if (!B && this.altFormats) {
            if (!this.altFormatsArray) {
                this.altFormatsArray = this.altFormats.split("|")
            }
            for (var C = 0, A = this.altFormatsArray.length; C < A && !B; C++) {
                B = Date.parseDate(D, this.altFormatsArray[C])
            }
        }
        return B
    },
    onDestroy: function() {
        if (this.menu) {
            this.menu.destroy()
        }
        if (this.wrap) {
            this.wrap.remove()
        }
        Ext.form.DateField.superclass.onDestroy.call(this)
    },
    formatDate: function(A) {
        return Ext.isDate(A) ? A.dateFormat(this.format) : A
    },
    menuListeners: {
        select: function(A, B) {
            this.setValue(B)
        },
        show: function() {
            this.onFocus()
        },
        hide: function() {
            this.focus.defer(10, this);
            var A = this.menuListeners;
            this.menu.un("select", A.select, this);
            this.menu.un("show", A.show, this);
            this.menu.un("hide", A.hide, this)
        }
    },
    onTriggerClick: function() {
        if (this.disabled) {
            return
        }
        if (this.menu == null) {
            this.menu = new Ext.menu.DateMenu()
        }
        Ext.apply(this.menu.picker, {
            minDate: this.minValue,
            maxDate: this.maxValue,
            disabledDatesRE: this.ddMatch,
            disabledDatesText: this.disabledDatesText,
            disabledDays: this.disabledDays,
            disabledDaysText: this.disabledDaysText,
            format: this.format,
            showToday: this.showToday,
            minText: String.format(this.minText, this.formatDate(this.minValue)),
            maxText: String.format(this.maxText, this.formatDate(this.maxValue))
        });
        this.menu.on(Ext.apply({},
        this.menuListeners, {
            scope: this
        }));
        this.menu.picker.setValue(this.getValue() || new Date());
        this.menu.show(this.el, "tl-bl?")
    },
    beforeBlur: function() {
        var A = this.parseDate(this.getRawValue());
        if (A) {
            this.setValue(A)
        }
    }
});
Ext.reg("datefield", Ext.form.DateField);
Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, {
    defaultAutoCreate: {
        tag: "input",
        type: "text",
        size: "24",
        autocomplete: "off"
    },
    listClass: "",
    selectedClass: "x-combo-selected",
    triggerClass: "x-form-arrow-trigger",
    shadow: "sides",
    listAlign: "tl-bl?",
    maxHeight: 300,
    minHeight: 90,
    triggerAction: "query",
    minChars: 4,
    typeAhead: false,
    queryDelay: 500,
    pageSize: 0,
    selectOnFocus: false,
    queryParam: "query",
    loadingText: "Loading...",
    resizable: false,
    handleHeight: 8,
    editable: true,
    allQuery: "",
    mode: "remote",
    minListWidth: 70,
    forceSelection: false,
    typeAheadDelay: 250,
    lazyInit: true,
    initComponent: function() {
        Ext.form.ComboBox.superclass.initComponent.call(this);
        this.addEvents("expand", "collapse", "beforeselect", "select", "beforequery");
        if (this.transform) {
            this.allowDomMove = false;
            var C = Ext.getDom(this.transform);
            if (!this.hiddenName) {
                this.hiddenName = C.name
            }
            if (!this.store) {
                this.mode = "local";
                var G = [],
                D = C.options;
                for (var B = 0, A = D.length; B < A; B++) {
                    var F = D[B];
                    var E = (Ext.isIE ? F.getAttributeNode("value").specified: F.hasAttribute("value")) ? F.value: F.text;
                    if (F.selected) {
                        this.value = E
                    }
                    G.push([E, F.text])
                }
                this.store = new Ext.data.SimpleStore({
                    "id": 0,
                    fields: ["value", "text"],
                    data: G
                });
                this.valueField = "value";
                this.displayField = "text"
            }
            C.name = Ext.id();
            if (!this.lazyRender) {
                this.target = true;
                this.el = Ext.DomHelper.insertBefore(C, this.autoCreate || this.defaultAutoCreate);
                Ext.removeNode(C);
                this.render(this.el.parentNode)
            } else {
                Ext.removeNode(C)
            }
        } else {
            if (Ext.isArray(this.store)) {
                if (Ext.isArray(this.store[0])) {
                    this.store = new Ext.data.SimpleStore({
                        fields: ["value", "text"],
                        data: this.store
                    });
                    this.valueField = "value"
                } else {
                    this.store = new Ext.data.SimpleStore({
                        fields: ["text"],
                        data: this.store,
                        expandData: true
                    });
                    this.valueField = "text"
                }
                this.displayField = "text";
                this.mode = "local"
            }
        }
        this.selectedIndex = -1;
        if (this.mode == "local") {
            if (this.initialConfig.queryDelay === undefined) {
                this.queryDelay = 10
            }
            if (this.initialConfig.minChars === undefined) {
                this.minChars = 0
            }
        }
    },
    onRender: function(B, A) {
        Ext.form.ComboBox.superclass.onRender.call(this, B, A);
        if (this.hiddenName) {
            this.hiddenField = this.el.insertSibling({
                tag: "input",
                type: "hidden",
                name: this.hiddenName,
                id: (this.hiddenId || this.hiddenName)
            },
            "before", true);
            this.el.dom.removeAttribute("name")
        }
        if (Ext.isGecko) {
            this.el.dom.setAttribute("autocomplete", "off")
        }
        if (!this.lazyInit) {
            this.initList()
        } else {
            this.on("focus", this.initList, this, {
                single: true
            })
        }
        if (!this.editable) {
            this.editable = true;
            this.setEditable(false)
        }
    },
    initValue: function() {
        Ext.form.ComboBox.superclass.initValue.call(this);
        if (this.hiddenField) {
            this.hiddenField.value = this.hiddenValue !== undefined ? this.hiddenValue: this.value !== undefined ? this.value: ""
        }
    },
    initList: function() {
        if (!this.list) {
            var A = "x-combo-list";
            this.list = new Ext.Layer({
                shadow: this.shadow,
                cls: [A, this.listClass].join(" "),
                constrain: false
            });
            var B = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);
            this.list.setWidth(B);
            this.list.swallowEvent("mousewheel");
            this.assetHeight = 0;
            if (this.title) {
                this.header = this.list.createChild({
                    cls: A + "-hd",
                    html: this.title
                });
                this.assetHeight += this.header.getHeight()
            }
            this.innerList = this.list.createChild({
                cls: A + "-inner"
            });
            this.innerList.on("mouseover", this.onViewOver, this);
            this.innerList.on("mousemove", this.onViewMove, this);
            this.innerList.setWidth(B - this.list.getFrameWidth("lr"));
            if (this.pageSize) {
                this.footer = this.list.createChild({
                    cls: A + "-ft"
                });
                this.pageTb = new Ext.PagingToolbar({
                    store: this.store,
                    pageSize: this.pageSize,
                    renderTo: this.footer
                });
                this.assetHeight += this.footer.getHeight()
            }
            if (!this.tpl) {
                this.tpl = "<tpl for=\".\"><div class=\"" + A + "-item\">{" + this.displayField + "}</div></tpl>"
            }
            this.view = new Ext.DataView({
                applyTo: this.innerList,
                tpl: this.tpl,
                singleSelect: true,
                selectedClass: this.selectedClass,
                itemSelector: this.itemSelector || "." + A + "-item"
            });
            this.view.on("click", this.onViewClick, this);
            this.bindStore(this.store, true);
            if (this.resizable) {
                this.resizer = new Ext.Resizable(this.list, {
                    pinned: true,
                    handles: "se"
                });
                this.resizer.on("resize",
                function(E, C, D) {
                    this.maxHeight = D - this.handleHeight - this.list.getFrameWidth("tb") - this.assetHeight;
                    this.listWidth = C;
                    this.innerList.setWidth(C - this.list.getFrameWidth("lr"));
                    this.restrictHeight()
                },
                this);
                this[this.pageSize ? "footer": "innerList"].setStyle("margin-bottom", this.handleHeight + "px")
            }
        }
    },
    bindStore: function(A, B) {
        if (this.store && !B) {
            this.store.un("beforeload", this.onBeforeLoad, this);
            this.store.un("load", this.onLoad, this);
            this.store.un("loadexception", this.collapse, this);
            if (!A) {
                this.store = null;
                if (this.view) {
                    this.view.setStore(null)
                }
            }
        }
        if (A) {
            this.store = Ext.StoreMgr.lookup(A);
            this.store.on("beforeload", this.onBeforeLoad, this);
            this.store.on("load", this.onLoad, this);
            this.store.on("loadexception", this.collapse, this);
            if (this.view) {
                this.view.setStore(A)
            }
        }
    },
    initEvents: function() {
        Ext.form.ComboBox.superclass.initEvents.call(this);
        this.keyNav = new Ext.KeyNav(this.el, {
            "up": function(A) {
                this.inKeyMode = true;
                this.selectPrev()
            },
            "down": function(A) {
                if (!this.isExpanded()) {
                    this.onTriggerClick()
                } else {
                    this.inKeyMode = true;
                    this.selectNext()
                }
            },
            "enter": function(A) {
                this.onViewClick();
                this.delayedCheck = true;
                this.unsetDelayCheck.defer(10, this)
            },
            "esc": function(A) {
                this.collapse()
            },
            "tab": function(A) {
                this.onViewClick(false);
                return true
            },
            scope: this,
            doRelay: function(C, B, A) {
                if (A == "down" || this.scope.isExpanded()) {
                    return Ext.KeyNav.prototype.doRelay.apply(this, arguments)
                }
                return true
            },
            forceKeyDown: true
        });
        this.queryDelay = Math.max(this.queryDelay || 10, this.mode == "local" ? 10 : 250);
        this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);
        if (this.typeAhead) {
            this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this)
        }
        if (this.editable !== false) {
            this.el.on("keyup", this.onKeyUp, this)
        }
        if (this.forceSelection) {
            this.on("blur", this.doForce, this)
        }
    },
    onDestroy: function() {
        if (this.view) {
            this.view.el.removeAllListeners();
            this.view.el.remove();
            this.view.purgeListeners()
        }
        if (this.list) {
            this.list.destroy()
        }
        this.bindStore(null);
        Ext.form.ComboBox.superclass.onDestroy.call(this)
    },
    unsetDelayCheck: function() {
        delete this.delayedCheck
    },
    fireKey: function(A) {
        if (A.isNavKeyPress() && !this.isExpanded() && !this.delayedCheck) {
            this.fireEvent("specialkey", this, A)
        }
    },
    onResize: function(A, B) {
        Ext.form.ComboBox.superclass.onResize.apply(this, arguments);
        if (this.list && this.listWidth === undefined) {
            var C = Math.max(A, this.minListWidth);
            this.list.setWidth(C);
            this.innerList.setWidth(C - this.list.getFrameWidth("lr"))
        }
    },
    onEnable: function() {
        Ext.form.ComboBox.superclass.onEnable.apply(this, arguments);
        if (this.hiddenField) {
            this.hiddenField.disabled = false
        }
    },
    onDisable: function() {
        Ext.form.ComboBox.superclass.onDisable.apply(this, arguments);
        if (this.hiddenField) {
            this.hiddenField.disabled = true
        }
    },
    setEditable: function(A) {
        if (A == this.editable) {
            return
        }
        this.editable = A;
        if (!A) {
            this.el.dom.setAttribute("readOnly", true);
            this.el.on("mousedown", this.onTriggerClick, this);
            this.el.addClass("x-combo-noedit")
        } else {
            this.el.dom.setAttribute("readOnly", false);
            this.el.un("mousedown", this.onTriggerClick, this);
            this.el.removeClass("x-combo-noedit")
        }
    },
    onBeforeLoad: function() {
        if (!this.hasFocus) {
            return
        }
        this.innerList.update(this.loadingText ? "<div class=\"loading-indicator\">" + this.loadingText + "</div>": "");
        this.restrictHeight();
        this.selectedIndex = -1
    },
    onLoad: function() {
        if (!this.hasFocus) {
            return
        }
        if (this.store.getCount() > 0) {
            this.expand();
            this.restrictHeight();
            if (this.lastQuery == this.allQuery) {
                if (this.editable) {
                    this.el.dom.select()
                }
                if (!this.selectByValue(this.value, true)) {
                    this.select(0, true)
                }
            } else {
                this.selectNext();
                if (this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE) {
                    this.taTask.delay(this.typeAheadDelay)
                }
            }
        } else {
            this.onEmptyResults()
        }
    },
    onTypeAhead: function() {
        if (this.store.getCount() > 0) {
            var B = this.store.getAt(0);
            var C = B.data[this.displayField];
            var A = C.length;
            var D = this.getRawValue().length;
            if (D != A) {
                this.setRawValue(C);
                this.selectText(D, C.length)
            }
        }
    },
    onSelect: function(A, B) {
        if (this.fireEvent("beforeselect", this, A, B) !== false) {
            this.setValue(A.data[this.valueField || this.displayField]);
            this.collapse();
            this.fireEvent("select", this, A, B)
        }
    },
    getValue: function() {
        if (this.valueField) {
            return typeof this.value != "undefined" ? this.value: ""
        } else {
            return Ext.form.ComboBox.superclass.getValue.call(this)
        }
    },
    clearValue: function() {
        if (this.hiddenField) {
            this.hiddenField.value = ""
        }
        this.setRawValue("");
        this.lastSelectionText = "";
        this.applyEmptyText();
        this.value = ""
    },
    setValue: function(A) {
        var C = A;
        if (this.valueField) {
            var B = this.findRecord(this.valueField, A);
            if (B) {
                C = B.data[this.displayField]
            } else {
                if (this.valueNotFoundText !== undefined) {
                    C = this.valueNotFoundText
                }
            }
        }
        this.lastSelectionText = C;
        if (this.hiddenField) {
            this.hiddenField.value = A
        }
        Ext.form.ComboBox.superclass.setValue.call(this, C);
        this.value = A
    },
    findRecord: function(C, B) {
        var A;
        if (this.store.getCount() > 0) {
            this.store.each(function(D) {
                if (D.data[C] == B) {
                    A = D;
                    return false
                }
            })
        }
        return A
    },
    onViewMove: function(B, A) {
        this.inKeyMode = false
    },
    onViewOver: function(D, B) {
        if (this.inKeyMode) {
            return
        }
        var C = this.view.findItemFromChild(B);
        if (C) {
            var A = this.view.indexOf(C);
            this.select(A, false)
        }
    },
    onViewClick: function(B) {
        var A = this.view.getSelectedIndexes()[0];
        var C = this.store.getAt(A);
        if (C) {
            this.onSelect(C, A)
        }
        if (B !== false) {
            this.el.focus()
        }
    },
    restrictHeight: function() {
        this.innerList.dom.style.height = "";
        var B = this.innerList.dom;
        var E = this.list.getFrameWidth("tb") + (this.resizable ? this.handleHeight: 0) + this.assetHeight;
        var C = Math.max(B.clientHeight, B.offsetHeight, B.scrollHeight);
        var A = this.getPosition()[1] - Ext.getBody().getScroll().top;
        var F = Ext.lib.Dom.getViewHeight() - A - this.getSize().height;
        var D = Math.max(A, F, this.minHeight || 0) - this.list.shadowOffset - E - 5;
        C = Math.min(C, D, this.maxHeight);
        this.innerList.setHeight(C);
        this.list.beginUpdate();
        this.list.setHeight(C + E);
        this.list.alignTo(this.wrap, this.listAlign);
        this.list.endUpdate()
    },
    onEmptyResults: function() {
        this.collapse()
    },
    isExpanded: function() {
        return this.list && this.list.isVisible()
    },
    selectByValue: function(A, C) {
        if (A !== undefined && A !== null) {
            var B = this.findRecord(this.valueField || this.displayField, A);
            if (B) {
                this.select(this.store.indexOf(B), C);
                return true
            }
        }
        return false
    },
    select: function(A, C) {
        this.selectedIndex = A;
        this.view.select(A);
        if (C !== false) {
            var B = this.view.getNode(A);
            if (B) {
                this.innerList.scrollChildIntoView(B, false)
            }
        }
    },
    selectNext: function() {
        var A = this.store.getCount();
        if (A > 0) {
            if (this.selectedIndex == -1) {
                this.select(0)
            } else {
                if (this.selectedIndex < A - 1) {
                    this.select(this.selectedIndex + 1)
                }
            }
        }
    },
    selectPrev: function() {
        var A = this.store.getCount();
        if (A > 0) {
            if (this.selectedIndex == -1) {
                this.select(0)
            } else {
                if (this.selectedIndex != 0) {
                    this.select(this.selectedIndex - 1)
                }
            }
        }
    },
    onKeyUp: function(A) {
        if (this.editable !== false && !A.isSpecialKey()) {
            this.lastKey = A.getKey();
            this.dqTask.delay(this.queryDelay)
        }
    },
    validateBlur: function() {
        return ! this.list || !this.list.isVisible()
    },
    initQuery: function() {
        this.doQuery(this.getRawValue())
    },
    doForce: function() {
        if (this.el.dom.value.length > 0) {
            this.el.dom.value = this.lastSelectionText === undefined ? "": this.lastSelectionText;
            this.applyEmptyText()
        }
    },
    doQuery: function(C, B) {
        if (C === undefined || C === null) {
            C = ""
        }
        B = ((B === false) ? false: true);
        var A = {
            query: C,
            forceAll: B,
            combo: this,
            cancel: false
        };
        if (this.fireEvent("beforequery", A) === false || A.cancel) {
            return false
        }
        C = A.query;
        B = A.forceAll;
        if (B === true || (C.length >= this.minChars)) {
            if (this.lastQuery !== C) {
                this.lastQuery = C;
                if (this.mode == "local") {
                    this.selectedIndex = -1;
                    if (B) {
                        this.store.clearFilter()
                    } else {
                        this.store.filter(this.displayField, C)
                    }
                    this.onLoad()
                } else {
                    this.store.baseParams[this.queryParam] = C;
                    this.store.load({
                        params: this.getParams(C)
                    });
                    this.expand()
                }
            } else {
                this.selectedIndex = -1;
                this.onLoad()
            }
        }
    },
    getParams: function(A) {
        var B = {};
        if (this.pageSize) {
            B.start = 0;
            B.limit = this.pageSize
        }
        return B
    },
    collapse: function() {
        if (!this.isExpanded()) {
            return
        }
        this.list.hide();
        Ext.getDoc().un("mousewheel", this.collapseIf, this);
        Ext.getDoc().un("mousedown", this.collapseIf, this);
        this.fireEvent("collapse", this)
    },
    collapseIf: function(A) {
        if (!A.within(this.wrap) && !A.within(this.list)) {
            this.collapse()
        }
    },
    expand: function() {
        if (this.isExpanded() || !this.hasFocus) {
            return
        }
        this.list.alignTo(this.wrap, this.listAlign);
        this.list.show();
        this.innerList.setOverflow("auto");
        Ext.getDoc().on("mousewheel", this.collapseIf, this);
        Ext.getDoc().on("mousedown", this.collapseIf, this);
        this.fireEvent("expand", this)
    },
    onTriggerClick: function() {
        if (this.disabled) {
            return
        }
        if (this.isExpanded()) {
            this.collapse();
            this.el.focus()
        } else {
            this.onFocus({});
            if (this.triggerAction == "all") {
                this.doQuery(this.allQuery, true)
            } else {
                this.doQuery(this.getRawValue())
            }
            this.el.focus()
        }
    }
});
Ext.reg("combo", Ext.form.ComboBox);
Ext.form.Checkbox = Ext.extend(Ext.form.Field, {
    checkedCls: "x-form-check-checked",
    focusCls: "x-form-check-focus",
    overCls: "x-form-check-over",
    mouseDownCls: "x-form-check-down",
    tabIndex: 0,
    checked: false,
    defaultAutoCreate: {
        tag: "input",
        type: "checkbox",
        autocomplete: "off"
    },
    baseCls: "x-form-check",
    initComponent: function() {
        Ext.form.Checkbox.superclass.initComponent.call(this);
        this.addEvents("check")
    },
    initEvents: function() {
        Ext.form.Checkbox.superclass.initEvents.call(this);
        this.initCheckEvents()
    },
    initCheckEvents: function() {
        this.innerWrap.removeAllListeners();
        this.innerWrap.addClassOnOver(this.overCls);
        this.innerWrap.addClassOnClick(this.mouseDownCls);
        this.innerWrap.on("click", this.onClick, this);
        this.innerWrap.on("keyup", this.onKeyUp, this)
    },
    onRender: function(B, A) {
        Ext.form.Checkbox.superclass.onRender.call(this, B, A);
        if (this.inputValue !== undefined) {
            this.el.dom.value = this.inputValue
        }
        this.el.addClass("x-hidden");
        this.innerWrap = this.el.wrap({
            tabIndex: this.tabIndex,
            cls: this.baseCls + "-wrap-inner"
        });
        this.wrap = this.innerWrap.wrap({
            cls: this.baseCls + "-wrap"
        });
        if (this.boxLabel) {
            this.labelEl = this.innerWrap.createChild({
                tag: "label",
                htmlFor: this.el.id,
                cls: "x-form-cb-label",
                html: this.boxLabel
            })
        }
        this.imageEl = this.innerWrap.createChild({
            tag: "img",
            src: Ext.BLANK_IMAGE_URL,
            cls: this.baseCls
        },
        this.el);
        if (this.checked) {
            this.setValue(true)
        } else {
            this.checked = this.el.dom.checked
        }
        this.originalValue = this.checked
    },
    onDestroy: function() {
        if (this.rendered) {
            Ext.destroy(this.imageEl, this.labelEl, this.innerWrap, this.wrap)
        }
        Ext.form.Checkbox.superclass.onDestroy.call(this)
    },
    onFocus: function(A) {
        Ext.form.Checkbox.superclass.onFocus.call(this, A);
        this.el.addClass(this.focusCls)
    },
    onBlur: function(A) {
        Ext.form.Checkbox.superclass.onBlur.call(this, A);
        this.el.removeClass(this.focusCls)
    },
    onResize: function() {
        Ext.form.Checkbox.superclass.onResize.apply(this, arguments);
        if (!this.boxLabel && !this.fieldLabel) {
            this.el.alignTo(this.wrap, "c-c")
        }
    },
    onKeyUp: function(A) {
        if (A.getKey() == Ext.EventObject.SPACE) {
            this.onClick(A)
        }
    },
    onClick: function(A) {
        if (!this.disabled && !this.readOnly) {
            this.toggleValue()
        }
        A.stopEvent()
    },
    onEnable: function() {
        Ext.form.Checkbox.superclass.onEnable.call(this);
        this.initCheckEvents()
    },
    onDisable: function() {
        Ext.form.Checkbox.superclass.onDisable.call(this);
        this.innerWrap.removeAllListeners()
    },
    toggleValue: function() {
        this.setValue(!this.checked)
    },
    getResizeEl: function() {
        if (!this.resizeEl) {
            this.resizeEl = Ext.isSafari ? this.wrap: (this.wrap.up(".x-form-element", 5) || this.wrap)
        }
        return this.resizeEl
    },
    getPositionEl: function() {
        return this.wrap
    },
    getActionEl: function() {
        return this.wrap
    },
    markInvalid: Ext.emptyFn,
    clearInvalid: Ext.emptyFn,
    initValue: Ext.emptyFn,
    getValue: function() {
        if (this.rendered) {
            return this.el.dom.checked
        }
        return false
    },
    setValue: function(A) {
        var B = this.checked;
        this.checked = (A === true || A === "true" || A == "1" || String(A).toLowerCase() == "on");
        if (this.el && this.el.dom) {
            this.el.dom.checked = this.checked;
            this.el.dom.defaultChecked = this.checked
        }
        this.wrap[this.checked ? "addClass": "removeClass"](this.checkedCls);
        if (B != this.checked) {
            this.fireEvent("check", this, this.checked);
            if (this.handler) {
                this.handler.call(this.scope || this, this, this.checked)
            }
        }
    }
});
Ext.reg("checkbox", Ext.form.Checkbox);
Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, {
    columns: "auto",
    vertical: false,
    allowBlank: true,
    blankText: "You must select at least one item in this group",
    defaultType: "checkbox",
    groupCls: "x-form-check-group",
    onRender: function(H, F) {
        if (!this.el) {
            var M = {
                cls: this.groupCls,
                layout: "column",
                border: false,
                renderTo: H
            };
            var A = {
                defaultType: this.defaultType,
                layout: "form",
                border: false,
                defaults: {
                    hideLabel: true,
                    anchor: "100%"
                }
            };
            if (this.items[0].items) {
                Ext.apply(M, {
                    layoutConfig: {
                        columns: this.items.length
                    },
                    defaults: this.defaults,
                    items: this.items
                });
                for (var E = 0, J = this.items.length; E < J; E++) {
                    Ext.applyIf(this.items[E], A)
                }
            } else {
                var D, K = [];
                if (typeof this.columns == "string") {
                    this.columns = this.items.length
                }
                if (!Ext.isArray(this.columns)) {
                    var I = [];
                    for (var E = 0; E < this.columns; E++) {
                        I.push((100 / this.columns) * 0.01)
                    }
                    this.columns = I
                }
                D = this.columns.length;
                for (var E = 0; E < D; E++) {
                    var B = Ext.apply({
                        items: []
                    },
                    A);
                    B[this.columns[E] <= 1 ? "columnWidth": "width"] = this.columns[E];
                    if (this.defaults) {
                        B.defaults = Ext.apply(B.defaults || {},
                        this.defaults)
                    }
                    K.push(B)
                }
                if (this.vertical) {
                    var O = Math.ceil(this.items.length / D),
                    L = 0;
                    for (var E = 0, J = this.items.length; E < J; E++) {
                        if (E > 0 && E % O == 0) {
                            L++
                        }
                        if (this.items[E].fieldLabel) {
                            this.items[E].hideLabel = false
                        }
                        K[L].items.push(this.items[E])
                    }
                } else {
                    for (var E = 0, J = this.items.length; E < J; E++) {
                        var N = E % D;
                        if (this.items[E].fieldLabel) {
                            this.items[E].hideLabel = false
                        }
                        K[N].items.push(this.items[E])
                    }
                }
                Ext.apply(M, {
                    layoutConfig: {
                        columns: D
                    },
                    items: K
                })
            }
            this.panel = new Ext.Panel(M);
            this.el = this.panel.getEl();
            if (this.forId && this.itemCls) {
                var C = this.el.up(this.itemCls).child("label", true);
                if (C) {
                    C.setAttribute("htmlFor", this.forId)
                }
            }
            var G = this.panel.findBy(function(P) {
                return P.isFormField
            },
            this);
            this.items = new Ext.util.MixedCollection();
            this.items.addAll(G)
        }
        Ext.form.CheckboxGroup.superclass.onRender.call(this, H, F)
    },
    validateValue: function(A) {
        if (!this.allowBlank) {
            var B = true;
            this.items.each(function(C) {
                if (C.checked) {
                    return B = false
                }
            },
            this);
            if (B) {
                this.markInvalid(this.blankText);
                return false
            }
        }
        return true
    },
    onDisable: function() {
        this.items.each(function(A) {
            A.disable()
        })
    },
    onEnable: function() {
        this.items.each(function(A) {
            A.enable()
        })
    },
    onResize: function(A, B) {
        this.panel.setSize(A, B);
        this.panel.doLayout()
    },
    reset: function() {
        Ext.form.CheckboxGroup.superclass.reset.call(this);
        this.items.each(function(A) {
            if (A.reset) {
                A.reset()
            }
        },
        this)
    },
    initValue: Ext.emptyFn,
    getValue: Ext.emptyFn,
    getRawValue: Ext.emptyFn,
    setValue: Ext.emptyFn,
    setRawValue: Ext.emptyFn
});
Ext.reg("checkboxgroup", Ext.form.CheckboxGroup);
Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {
    inputType: "radio",
    baseCls: "x-form-radio",
    getGroupValue: function() {
        var A = this.getParent().child("input[name=" + this.el.dom.name + "]:checked", true);
        return A ? A.value: null
    },
    getParent: function() {
        return this.el.up("form") || Ext.getBody()
    },
    toggleValue: function() {
        if (!this.checked) {
            var A = this.getParent().select("input[name=" + this.el.dom.name + "]");
            A.each(function(B) {
                if (B.dom.id == this.id) {
                    this.setValue(true)
                } else {
                    Ext.getCmp(B.dom.id).setValue(false)
                }
            },
            this)
        }
    },
    setValue: function(A) {
        if (typeof A == "boolean") {
            Ext.form.Radio.superclass.setValue.call(this, A)
        } else {
            var B = this.getParent().child("input[name=" + this.el.dom.name + "][value=" + A + "]", true);
            if (B && !B.checked) {
                Ext.getCmp(B.id).toggleValue()
            }
        }
    },
    markInvalid: Ext.emptyFn,
    clearInvalid: Ext.emptyFn
});
Ext.reg("radio", Ext.form.Radio);
Ext.form.RadioGroup = Ext.extend(Ext.form.CheckboxGroup, {
    allowBlank: true,
    blankText: "You must select one item in this group",
    defaultType: "radio",
    groupCls: "x-form-radio-group"
});
Ext.reg("radiogroup", Ext.form.RadioGroup);
Ext.form.Hidden = Ext.extend(Ext.form.Field, {
    inputType: "hidden",
    onRender: function() {
        Ext.form.Hidden.superclass.onRender.apply(this, arguments)
    },
    initEvents: function() {
        this.originalValue = this.getValue()
    },
    setSize: Ext.emptyFn,
    setWidth: Ext.emptyFn,
    setHeight: Ext.emptyFn,
    setPosition: Ext.emptyFn,
    setPagePosition: Ext.emptyFn,
    markInvalid: Ext.emptyFn,
    clearInvalid: Ext.emptyFn
});
Ext.reg("hidden", Ext.form.Hidden);
Ext.form.BasicForm = function(B, A) {
    Ext.apply(this, A);
    this.items = new Ext.util.MixedCollection(false,
    function(C) {
        return C.id || (C.id = Ext.id())
    });
    this.addEvents("beforeaction", "actionfailed", "actioncomplete");
    if (B) {
        this.initEl(B)
    }
    Ext.form.BasicForm.superclass.constructor.call(this)
};
Ext.extend(Ext.form.BasicForm, Ext.util.Observable, {
    timeout: 30,
    activeAction: null,
    trackResetOnLoad: false,
    initEl: function(A) {
        this.el = Ext.get(A);
        this.id = this.el.id || Ext.id();
        if (!this.standardSubmit) {
            this.el.on("submit", this.onSubmit, this)
        }
        this.el.addClass("x-form")
    },
    getEl: function() {
        return this.el
    },
    onSubmit: function(A) {
        A.stopEvent()
    },
    destroy: function() {
        this.items.each(function(A) {
            Ext.destroy(A)
        });
        if (this.el) {
            this.el.removeAllListeners();
            this.el.remove()
        }
        this.purgeListeners()
    },
    isValid: function() {
        var A = true;
        this.items.each(function(B) {
            if (!B.validate()) {
                A = false
            }
        });
        return A
    },
    isDirty: function() {
        var A = false;
        this.items.each(function(B) {
            if (B.isDirty()) {
                A = true;
                return false
            }
        });
        return A
    },
    doAction: function(B, A) {
        if (typeof B == "string") {
            B = new Ext.form.Action.ACTION_TYPES[B](this, A)
        }
        if (this.fireEvent("beforeaction", this, B) !== false) {
            this.beforeAction(B);
            B.run.defer(100, B)
        }
        return this
    },
    submit: function(B) {
        if (this.standardSubmit) {
            var A = this.isValid();
            if (A) {
                this.el.dom.submit()
            }
            return A
        }
        this.doAction("submit", B);
        return this
    },
    load: function(A) {
        this.doAction("load", A);
        return this
    },
    updateRecord: function(B) {
        B.beginEdit();
        var A = B.fields;
        A.each(function(C) {
            var D = this.findField(C.name);
            if (D) {
                B.set(C.name, D.getValue())
            }
        },
        this);
        B.endEdit();
        return this
    },
    loadRecord: function(A) {
        this.setValues(A.data);
        return this
    },
    beforeAction: function(A) {
        var B = A.options;
        if (B.waitMsg) {
            if (this.waitMsgTarget === true) {
                this.el.mask(B.waitMsg, "x-mask-loading")
            } else {
                if (this.waitMsgTarget) {
                    this.waitMsgTarget = Ext.get(this.waitMsgTarget);
                    this.waitMsgTarget.mask(B.waitMsg, "x-mask-loading")
                } else {
                    Ext.MessageBox.wait(B.waitMsg, B.waitTitle || this.waitTitle || "Please Wait...")
                }
            }
        }
    },
    afterAction: function(A, C) {
        this.activeAction = null;
        var B = A.options;
        if (B.waitMsg) {
            if (this.waitMsgTarget === true) {
                this.el.unmask()
            } else {
                if (this.waitMsgTarget) {
                    this.waitMsgTarget.unmask()
                } else {
                    Ext.MessageBox.updateProgress(1);
                    Ext.MessageBox.hide()
                }
            }
        }
        if (C) {
            if (B.reset) {
                this.reset()
            }
            Ext.callback(B.success, B.scope, [this, A]);
            this.fireEvent("actioncomplete", this, A)
        } else {
            Ext.callback(B.failure, B.scope, [this, A]);
            this.fireEvent("actionfailed", this, A)
        }
    },
    findField: function(B) {
        var A = this.items.get(B);
        if (!A) {
            this.items.each(function(C) {
                if (C.isFormField && (C.dataIndex == B || C.id == B || C.getName() == B)) {
                    A = C;
                    return false
                }
            })
        }
        return A || null
    },
    markInvalid: function(G) {
        if (Ext.isArray(G)) {
            for (var C = 0, A = G.length; C < A; C++) {
                var B = G[C];
                var D = this.findField(B.id);
                if (D) {
                    D.markInvalid(B.msg)
                }
            }
        } else {
            var E, F;
            for (F in G) {
                if (typeof G[F] != "function" && (E = this.findField(F))) {
                    E.markInvalid(G[F])
                }
            }
        }
        return this
    },
    setValues: function(C) {
        if (Ext.isArray(C)) {
            for (var D = 0, A = C.length; D < A; D++) {
                var B = C[D];
                var E = this.findField(B.id);
                if (E) {
                    E.setValue(B.value);
                    if (this.trackResetOnLoad) {
                        E.originalValue = E.getValue()
                    }
                }
            }
        } else {
            var F, G;
            for (G in C) {
                if (typeof C[G] != "function" && (F = this.findField(G))) {
                    F.setValue(C[G]);
                    if (this.trackResetOnLoad) {
                        F.originalValue = F.getValue()
                    }
                }
            }
        }
        return this
    },
    getValues: function(B) {
        var A = Ext.lib.Ajax.serializeForm(this.el.dom);
        if (B === true) {
            return A
        }
        return Ext.urlDecode(A)
    },
    clearInvalid: function() {
        this.items.each(function(A) {
            A.clearInvalid()
        });
        return this
    },
    reset: function() {
        this.items.each(function(A) {
            A.reset()
        });
        return this
    },
    add: function() {
        this.items.addAll(Array.prototype.slice.call(arguments, 0));
        return this
    },
    remove: function(A) {
        this.items.remove(A);
        return this
    },
    render: function() {
        this.items.each(function(A) {
            if (A.isFormField && !A.rendered && document.getElementById(A.id)) {
                A.applyToMarkup(A.id)
            }
        });
        return this
    },
    applyToFields: function(A) {
        this.items.each(function(B) {
            Ext.apply(B, A)
        });
        return this
    },
    applyIfToFields: function(A) {
        this.items.each(function(B) {
            Ext.applyIf(B, A)
        });
        return this
    }
});
Ext.BasicForm = Ext.form.BasicForm;
Ext.FormPanel = Ext.extend(Ext.Panel, {
    buttonAlign: "center",
    minButtonWidth: 75,
    labelAlign: "left",
    monitorValid: false,
    monitorPoll: 200,
    layout: "form",
    initComponent: function() {
        this.form = this.createForm();
        this.bodyCfg = {
            tag: "form",
            cls: this.baseCls + "-body",
            method: this.method || "POST",
            id: this.formId || Ext.id()
        };
        if (this.fileUpload) {
            this.bodyCfg.enctype = "multipart/form-data"
        }
        Ext.FormPanel.superclass.initComponent.call(this);
        this.addEvents("clientvalidation");
        this.relayEvents(this.form, ["beforeaction", "actionfailed", "actioncomplete"])
    },
    createForm: function() {
        delete this.initialConfig.listeners;
        return new Ext.form.BasicForm(null, this.initialConfig)
    },
    initFields: function() {
        var C = this.form;
        var A = this;
        var B = function(D) {
            if (D.isFormField) {
                C.add(D)
            } else {
                if (D.doLayout && D != A) {
                    Ext.applyIf(D, {
                        labelAlign: D.ownerCt.labelAlign,
                        labelWidth: D.ownerCt.labelWidth,
                        itemCls: D.ownerCt.itemCls
                    });
                    if (D.items) {
                        D.items.each(B)
                    }
                }
            }
        };
        this.items.each(B)
    },
    getLayoutTarget: function() {
        return this.form.el
    },
    getForm: function() {
        return this.form
    },
    onRender: function(B, A) {
        this.initFields();
        Ext.FormPanel.superclass.onRender.call(this, B, A);
        this.form.initEl(this.body)
    },
    beforeDestroy: function() {
        Ext.FormPanel.superclass.beforeDestroy.call(this);
        this.stopMonitoring();
        Ext.destroy(this.form)
    },
    initEvents: function() {
        Ext.FormPanel.superclass.initEvents.call(this);
        this.items.on("remove", this.onRemove, this);
        this.items.on("add", this.onAdd, this);
        if (this.monitorValid) {
            this.startMonitoring()
        }
    },
    onAdd: function(A, B) {
        if (B.isFormField) {
            this.form.add(B)
        }
    },
    onRemove: function(A) {
        if (A.isFormField) {
            Ext.destroy(A.container.up(".x-form-item"));
            this.form.remove(A)
        }
    },
    startMonitoring: function() {
        if (!this.bound) {
            this.bound = true;
            Ext.TaskMgr.start({
                run: this.bindHandler,
                interval: this.monitorPoll || 200,
                scope: this
            })
        }
    },
    stopMonitoring: function() {
        this.bound = false
    },
    load: function() {
        this.form.load.apply(this.form, arguments)
    },
    onDisable: function() {
        Ext.FormPanel.superclass.onDisable.call(this);
        if (this.form) {
            this.form.items.each(function() {
                this.disable()
            })
        }
    },
    onEnable: function() {
        Ext.FormPanel.superclass.onEnable.call(this);
        if (this.form) {
            this.form.items.each(function() {
                this.enable()
            })
        }
    },
    bindHandler: function() {
        if (!this.bound) {
            return false
        }
        var D = true;
        this.form.items.each(function(E) {
            if (!E.isValid(true)) {
                D = false;
                return false
            }
        });
        if (this.buttons) {
            for (var C = 0, A = this.buttons.length; C < A; C++) {
                var B = this.buttons[C];
                if (B.formBind === true && B.disabled === D) {
                    B.setDisabled(!D)
                }
            }
        }
        this.fireEvent("clientvalidation", this, D)
    }
});
Ext.reg("form", Ext.FormPanel);
Ext.form.FormPanel = Ext.FormPanel;
Ext.form.FieldSet = Ext.extend(Ext.Panel, {
    baseCls: "x-fieldset",
    layout: "form",
    onRender: function(B, A) {
        if (!this.el) {
            this.el = document.createElement("fieldset");
            this.el.id = this.id;
            if (this.title || this.header || this.checkboxToggle) {
                this.el.appendChild(document.createElement("legend")).className = "x-fieldset-header"
            }
        }
        Ext.form.FieldSet.superclass.onRender.call(this, B, A);
        if (this.checkboxToggle) {
            var C = typeof this.checkboxToggle == "object" ? this.checkboxToggle: {
                tag: "input",
                type: "checkbox",
                name: this.checkboxName || this.id + "-checkbox"
            };
            this.checkbox = this.header.insertFirst(C);
            this.checkbox.dom.checked = !this.collapsed;
            this.checkbox.on("click", this.onCheckClick, this)
        }
    },
    onCollapse: function(A, B) {
        if (this.checkbox) {
            this.checkbox.dom.checked = false
        }
        this.afterCollapse()
    },
    onExpand: function(A, B) {
        if (this.checkbox) {
            this.checkbox.dom.checked = true
        }
        this.afterExpand()
    },
    onCheckClick: function() {
        this[this.checkbox.dom.checked ? "expand": "collapse"]()
    }
});
Ext.reg("fieldset", Ext.form.FieldSet);
Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {
    enableFormat: true,
    enableFontSize: true,
    enableColors: true,
    enableAlignments: true,
    enableLists: true,
    enableSourceEdit: true,
    enableLinks: true,
    enableFont: true,
    createLinkText: "Please enter the URL for the link:",
    defaultLinkValue: "http:/" + "/",
    fontFamilies: ["Arial", "Courier New", "Tahoma", "Times New Roman", "Verdana"],
    defaultFont: "tahoma",
    validationEvent: false,
    deferHeight: true,
    initialized: false,
    activated: false,
    sourceEditMode: false,
    onFocus: Ext.emptyFn,
    iframePad: 3,
    hideMode: "offsets",
    defaultAutoCreate: {
        tag: "textarea",
        style: "width:500px;height:300px;",
        autocomplete: "off"
    },
    initComponent: function() {
        this.addEvents("initialize", "activate", "beforesync", "beforepush", "sync", "push", "editmodechange")
    },
    createFontOptions: function() {
        var D = [],
        B = this.fontFamilies,
        C,
        F;
        for (var E = 0, A = B.length; E < A; E++) {
            C = B[E];
            F = C.toLowerCase();
            D.push("<option value=\"", F, "\" style=\"font-family:", C, ";\"", (this.defaultFont == F ? " selected=\"true\">": ">"), C, "</option>")
        }
        return D.join("")
    },
    createToolbar: function(D) {
        var A = Ext.QuickTips && Ext.QuickTips.isEnabled();
        function C(G, E, F) {
            return {
                itemId: G,
                cls: "x-btn-icon x-edit-" + G,
                enableToggle: E !== false,
                scope: D,
                handler: F || D.relayBtnCmd,
                clickEvent: "mousedown",
                tooltip: A ? D.buttonTips[G] || undefined: undefined,
                tabIndex: -1
            }
        }
        var B = new Ext.Toolbar({
            renderTo: this.wrap.dom.firstChild
        });
        B.el.on("click",
        function(E) {
            E.preventDefault()
        });
        if (this.enableFont && !Ext.isSafari2) {
            this.fontSelect = B.el.createChild({
                tag: "select",
                cls: "x-font-select",
                html: this.createFontOptions()
            });
            this.fontSelect.on("change",
            function() {
                var E = this.fontSelect.dom.value;
                this.relayCmd("fontname", E);
                this.deferFocus()
            },
            this);
            B.add(this.fontSelect.dom, "-")
        }
        if (this.enableFormat) {
            B.add(C("bold"), C("italic"), C("underline"))
        }
        if (this.enableFontSize) {
            B.add("-", C("increasefontsize", false, this.adjustFont), C("decreasefontsize", false, this.adjustFont))
        }
        if (this.enableColors) {
            B.add("-", {
                itemId: "forecolor",
                cls: "x-btn-icon x-edit-forecolor",
                clickEvent: "mousedown",
                tooltip: A ? D.buttonTips["forecolor"] || undefined: undefined,
                tabIndex: -1,
                menu: new Ext.menu.ColorMenu({
                    allowReselect: true,
                    focus: Ext.emptyFn,
                    value: "000000",
                    plain: true,
                    selectHandler: function(F, E) {
                        this.execCmd("forecolor", Ext.isSafari || Ext.isIE ? "#" + E: E);
                        this.deferFocus()
                    },
                    scope: this,
                    clickEvent: "mousedown"
                })
            },
            {
                itemId: "backcolor",
                cls: "x-btn-icon x-edit-backcolor",
                clickEvent: "mousedown",
                tooltip: A ? D.buttonTips["backcolor"] || undefined: undefined,
                tabIndex: -1,
                menu: new Ext.menu.ColorMenu({
                    focus: Ext.emptyFn,
                    value: "FFFFFF",
                    plain: true,
                    allowReselect: true,
                    selectHandler: function(F, E) {
                        if (Ext.isGecko) {
                            this.execCmd("useCSS", false);
                            this.execCmd("hilitecolor", E);
                            this.execCmd("useCSS", true);
                            this.deferFocus()
                        } else {
                            this.execCmd(Ext.isOpera ? "hilitecolor": "backcolor", Ext.isSafari || Ext.isIE ? "#" + E: E);
                            this.deferFocus()
                        }
                    },
                    scope: this,
                    clickEvent: "mousedown"
                })
            })
        }
        if (this.enableAlignments) {
            B.add("-", C("justifyleft"), C("justifycenter"), C("justifyright"))
        }
        if (!Ext.isSafari2) {
            if (this.enableLinks) {
                B.add("-", C("createlink", false, this.createLink))
            }
            if (this.enableLists) {
                B.add("-", C("insertorderedlist"), C("insertunorderedlist"))
            }
            if (this.enableSourceEdit) {
                B.add("-", C("sourceedit", true,
                function(E) {
                    this.toggleSourceEdit(E.pressed)
                }))
            }
        }
        this.tb = B
    },
    getDocMarkup: function() {
        return "<html><head><style type=\"text/css\">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>"
    },
    getEditorBody: function() {
        return this.doc.body || this.doc.documentElement
    },
    getDoc: function() {
        return Ext.isIE ? this.getWin().document: (this.iframe.contentDocument || this.getWin().document)
    },
    getWin: function() {
        return Ext.isIE ? this.iframe.contentWindow: window.frames[this.iframe.name]
    },
    onRender: function(B, A) {
        Ext.form.HtmlEditor.superclass.onRender.call(this, B, A);
        this.el.dom.style.border = "0 none";
        this.el.dom.setAttribute("tabIndex", -1);
        this.el.addClass("x-hidden");
        if (Ext.isIE) {
            this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")
        }
        this.wrap = this.el.wrap({
            cls: "x-html-editor-wrap",
            cn: {
                cls: "x-html-editor-tb"
            }
        });
        this.createToolbar(this);
        this.tb.items.each(function(E) {
            if (E.itemId != "sourceedit") {
                E.disable()
            }
        });
        var C = document.createElement("iframe");
        C.name = Ext.id();
        C.frameBorder = "0";
        C.src = Ext.isIE ? Ext.SSL_SECURE_URL: "javascript:;";
        this.wrap.dom.appendChild(C);
        this.iframe = C;
        this.initFrame();
        if (this.autoMonitorDesignMode !== false) {
            this.monitorTask = Ext.TaskMgr.start({
                run: this.checkDesignMode,
                scope: this,
                interval: 100
            })
        }
        if (!this.width) {
            var D = this.el.getSize();
            this.setSize(D.width, this.height || D.height)
        }
    },
    initFrame: function() {
        this.doc = this.getDoc();
        this.win = this.getWin();
        this.doc.open();
        this.doc.write(this.getDocMarkup());
        this.doc.close();
        var A = {
            run: function() {
                if (this.doc.body || this.doc.readyState == "complete") {
                    Ext.TaskMgr.stop(A);
                    this.doc.designMode = "on";
                    this.initEditor.defer(10, this)
                }
            },
            interval: 10,
            duration: 10000,
            scope: this
        };
        Ext.TaskMgr.start(A)
    },
    checkDesignMode: function() {
        if (this.wrap && this.wrap.dom.offsetWidth) {
            var A = this.getDoc();
            if (!A) {
                return
            }
            if (!A.editorInitialized || String(A.designMode).toLowerCase() != "on") {
                this.initFrame()
            }
        }
    },
    onResize: function(B, C) {
        Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);
        if (this.el && this.iframe) {
            if (typeof B == "number") {
                var D = B - this.wrap.getFrameWidth("lr");
                this.el.setWidth(this.adjustWidth("textarea", D));
                this.iframe.style.width = D + "px"
            }
            if (typeof C == "number") {
                var A = C - this.wrap.getFrameWidth("tb") - this.tb.el.getHeight();
                this.el.setHeight(this.adjustWidth("textarea", A));
                this.iframe.style.height = A + "px";
                if (this.doc) {
                    this.getEditorBody().style.height = (A - (this.iframePad * 2)) + "px"
                }
            }
        }
    },
    toggleSourceEdit: function(A) {
        if (A === undefined) {
            A = !this.sourceEditMode
        }
        this.sourceEditMode = A === true;
        var C = this.tb.items.get("sourceedit");
        if (C.pressed !== this.sourceEditMode) {
            C.toggle(this.sourceEditMode);
            return
        }
        if (this.sourceEditMode) {
            this.tb.items.each(function(D) {
                if (D.itemId != "sourceedit") {
                    D.disable()
                }
            });
            this.syncValue();
            this.iframe.className = "x-hidden";
            this.el.removeClass("x-hidden");
            this.el.dom.removeAttribute("tabIndex");
            this.el.focus()
        } else {
            if (this.initialized) {
                this.tb.items.each(function(D) {
                    D.enable()
                })
            }
            this.pushValue();
            this.iframe.className = "";
            this.el.addClass("x-hidden");
            this.el.dom.setAttribute("tabIndex", -1);
            this.deferFocus()
        }
        var B = this.lastSize;
        if (B) {
            delete this.lastSize;
            this.setSize(B)
        }
        this.fireEvent("editmodechange", this, this.sourceEditMode)
    },
    createLink: function() {
        var A = prompt(this.createLinkText, this.defaultLinkValue);
        if (A && A != "http:/" + "/") {
            this.relayCmd("createlink", A)
        }
    },
    adjustSize: Ext.BoxComponent.prototype.adjustSize,
    getResizeEl: function() {
        return this.wrap
    },
    getPositionEl: function() {
        return this.wrap
    },
    initEvents: function() {
        this.originalValue = this.getValue()
    },
    markInvalid: Ext.emptyFn,
    clearInvalid: Ext.emptyFn,
    setValue: function(A) {
        Ext.form.HtmlEditor.superclass.setValue.call(this, A);
        this.pushValue()
    },
    cleanHtml: function(A) {
        A = String(A);
        if (A.length > 5) {
            if (Ext.isSafari) {
                A = A.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, "")
            }
        }
        if (A == "&nbsp;") {
            A = ""
        }
        return A
    },
    syncValue: function() {
        if (this.initialized) {
            var D = this.getEditorBody();
            var C = D.innerHTML;
            if (Ext.isSafari) {
                var B = D.getAttribute("style");
                var A = B.match(/text-align:(.*?);/i);
                if (A && A[1]) {
                    C = "<div style=\"" + A[0] + "\">" + C + "</div>"
                }
            }
            C = this.cleanHtml(C);
            if (this.fireEvent("beforesync", this, C) !== false) {
                this.el.dom.value = C;
                this.fireEvent("sync", this, C)
            }
        }
    },
    pushValue: function() {
        if (this.initialized) {
            var A = this.el.dom.value;
            if (!this.activated && A.length < 1) {
                A = "&nbsp;"
            }
            if (this.fireEvent("beforepush", this, A) !== false) {
                this.getEditorBody().innerHTML = A;
                this.fireEvent("push", this, A)
            }
        }
    },
    deferFocus: function() {
        this.focus.defer(10, this)
    },
    focus: function() {
        if (this.win && !this.sourceEditMode) {
            this.win.focus()
        } else {
            this.el.focus()
        }
    },
    initEditor: function() {
        var B = this.getEditorBody();
        var A = this.el.getStyles("font-size", "font-family", "background-image", "background-repeat");
        A["background-attachment"] = "fixed";
        B.bgProperties = "fixed";
        Ext.DomHelper.applyStyles(B, A);
        if (this.doc) {
            try {
                Ext.EventManager.removeAll(this.doc)
            } catch(C) {}
        }
        this.doc = this.getDoc();
        Ext.EventManager.on(this.doc, {
            "mousedown": this.onEditorEvent,
            "dblclick": this.onEditorEvent,
            "click": this.onEditorEvent,
            "keyup": this.onEditorEvent,
            buffer: 100,
            scope: this
        });
        if (Ext.isGecko) {
            Ext.EventManager.on(this.doc, "keypress", this.applyCommand, this)
        }
        if (Ext.isIE || Ext.isSafari || Ext.isOpera) {
            Ext.EventManager.on(this.doc, "keydown", this.fixKeys, this)
        }
        this.initialized = true;
        this.fireEvent("initialize", this);
        this.doc.editorInitialized = true;
        this.pushValue()
    },
    onDestroy: function() {
        if (this.monitorTask) {
            Ext.TaskMgr.stop(this.monitorTask)
        }
        if (this.rendered) {
            this.tb.items.each(function(A) {
                if (A.menu) {
                    A.menu.removeAll();
                    if (A.menu.el) {
                        A.menu.el.destroy()
                    }
                }
                A.destroy()
            });
            this.wrap.dom.innerHTML = "";
            this.wrap.remove()
        }
    },
    onFirstFocus: function() {
        this.activated = true;
        this.tb.items.each(function(D) {
            D.enable()
        });
        if (Ext.isGecko) {
            this.win.focus();
            var A = this.win.getSelection();
            if (!A.focusNode || A.focusNode.nodeType != 3) {
                var B = A.getRangeAt(0);
                B.selectNodeContents(this.getEditorBody());
                B.collapse(true);
                this.deferFocus()
            }
            try {
                this.execCmd("useCSS", true);
                this.execCmd("styleWithCSS", false)
            } catch(C) {}
        }
        this.fireEvent("activate", this)
    },
    adjustFont: function(B) {
        var C = B.itemId == "increasefontsize" ? 1 : -1;
        var A = parseInt(this.doc.queryCommandValue("FontSize") || 2, 10);
        if (Ext.isSafari3 || Ext.isAir) {
            if (A <= 10) {
                A = 1 + C
            } else {
                if (A <= 13) {
                    A = 2 + C
                } else {
                    if (A <= 16) {
                        A = 3 + C
                    } else {
                        if (A <= 18) {
                            A = 4 + C
                        } else {
                            if (A <= 24) {
                                A = 5 + C
                            } else {
                                A = 6 + C
                            }
                        }
                    }
                }
            }
            A = A.constrain(1, 6)
        } else {
            if (Ext.isSafari) {
                C *= 2
            }
            A = Math.max(1, A + C) + (Ext.isSafari ? "px": 0)
        }
        this.execCmd("FontSize", A)
    },
    onEditorEvent: function(A) {
        this.updateToolbar()
    },
    updateToolbar: function() {
        if (!this.activated) {
            this.onFirstFocus();
            return
        }
        var B = this.tb.items.map,
        C = this.doc;
        if (this.enableFont && !Ext.isSafari2) {
            var A = (this.doc.queryCommandValue("FontName") || this.defaultFont).toLowerCase();
            if (A != this.fontSelect.dom.value) {
                this.fontSelect.dom.value = A
            }
        }
        if (this.enableFormat) {
            B.bold.toggle(C.queryCommandState("bold"));
            B.italic.toggle(C.queryCommandState("italic"));
            B.underline.toggle(C.queryCommandState("underline"))
        }
        if (this.enableAlignments) {
            B.justifyleft.toggle(C.queryCommandState("justifyleft"));
            B.justifycenter.toggle(C.queryCommandState("justifycenter"));
            B.justifyright.toggle(C.queryCommandState("justifyright"))
        }
        if (!Ext.isSafari2 && this.enableLists) {
            B.insertorderedlist.toggle(C.queryCommandState("insertorderedlist"));
            B.insertunorderedlist.toggle(C.queryCommandState("insertunorderedlist"))
        }
        Ext.menu.MenuMgr.hideAll();
        this.syncValue()
    },
    relayBtnCmd: function(A) {
        this.relayCmd(A.itemId)
    },
    relayCmd: function(B, A) { (function() {
            this.focus();
            this.execCmd(B, A);
            this.updateToolbar()
        }).defer(10, this)
    },
    execCmd: function(B, A) {
        this.doc.execCommand(B, false, A === undefined ? null: A);
        this.syncValue()
    },
    applyCommand: function(B) {
        if (B.ctrlKey) {
            var C = B.getCharCode(),
            A;
            if (C > 0) {
                C = String.fromCharCode(C);
                switch (C) {
                case "b":
                    A = "bold";
                    break;
                case "i":
                    A = "italic";
                    break;
                case "u":
                    A = "underline";
                    break
                }
                if (A) {
                    this.win.focus();
                    this.execCmd(A);
                    this.deferFocus();
                    B.preventDefault()
                }
            }
        }
    },
    insertAtCursor: function(B) {
        if (!this.activated) {
            return
        }
        if (Ext.isIE) {
            this.win.focus();
            var A = this.doc.selection.createRange();
            if (A) {
                A.collapse(true);
                A.pasteHTML(B);
                this.syncValue();
                this.deferFocus()
            }
        } else {
            if (Ext.isGecko || Ext.isOpera) {
                this.win.focus();
                this.execCmd("InsertHTML", B);
                this.deferFocus()
            } else {
                if (Ext.isSafari) {
                    this.execCmd("InsertText", B);
                    this.deferFocus()
                }
            }
        }
    },
    fixKeys: function() {
        if (Ext.isIE) {
            return function(D) {
                var A = D.getKey(),
                B;
                if (A == D.TAB) {
                    D.stopEvent();
                    B = this.doc.selection.createRange();
                    if (B) {
                        B.collapse(true);
                        B.pasteHTML("&nbsp;&nbsp;&nbsp;&nbsp;");
                        this.deferFocus()
                    }
                } else {
                    if (A == D.ENTER) {
                        B = this.doc.selection.createRange();
                        if (B) {
                            var C = B.parentElement();
                            if (!C || C.tagName.toLowerCase() != "li") {
                                D.stopEvent();
                                B.pasteHTML("<br />");
                                B.collapse(false);
                                B.select()
                            }
                        }
                    }
                }
            }
        } else {
            if (Ext.isOpera) {
                return function(B) {
                    var A = B.getKey();
                    if (A == B.TAB) {
                        B.stopEvent();
                        this.win.focus();
                        this.execCmd("InsertHTML", "&nbsp;&nbsp;&nbsp;&nbsp;");
                        this.deferFocus()
                    }
                }
            } else {
                if (Ext.isSafari) {
                    return function(B) {
                        var A = B.getKey();
                        if (A == B.TAB) {
                            B.stopEvent();
                            this.execCmd("InsertText", "\t");
                            this.deferFocus()
                        }
                    }
                }
            }
        }
    } (),
    getToolbar: function() {
        return this.tb
    },
    buttonTips: {
        bold: {
            title: "Bold (Ctrl+B)",
            text: "Make the selected text bold.",
            cls: "x-html-editor-tip"
        },
        italic: {
            title: "Italic (Ctrl+I)",
            text: "Make the selected text italic.",
            cls: "x-html-editor-tip"
        },
        underline: {
            title: "Underline (Ctrl+U)",
            text: "Underline the selected text.",
            cls: "x-html-editor-tip"
        },
        increasefontsize: {
            title: "Grow Text",
            text: "Increase the font size.",
            cls: "x-html-editor-tip"
        },
        decreasefontsize: {
            title: "Shrink Text",
            text: "Decrease the font size.",
            cls: "x-html-editor-tip"
        },
        backcolor: {
            title: "Text Highlight Color",
            text: "Change the background color of the selected text.",
            cls: "x-html-editor-tip"
        },
        forecolor: {
            title: "Font Color",
            text: "Change the color of the selected text.",
            cls: "x-html-editor-tip"
        },
        justifyleft: {
            title: "Align Text Left",
            text: "Align text to the left.",
            cls: "x-html-editor-tip"
        },
        justifycenter: {
            title: "Center Text",
            text: "Center text in the editor.",
            cls: "x-html-editor-tip"
        },
        justifyright: {
            title: "Align Text Right",
            text: "Align text to the right.",
            cls: "x-html-editor-tip"
        },
        insertunorderedlist: {
            title: "Bullet List",
            text: "Start a bulleted list.",
            cls: "x-html-editor-tip"
        },
        insertorderedlist: {
            title: "Numbered List",
            text: "Start a numbered list.",
            cls: "x-html-editor-tip"
        },
        createlink: {
            title: "Hyperlink",
            text: "Make the selected text a hyperlink.",
            cls: "x-html-editor-tip"
        },
        sourceedit: {
            title: "Source Edit",
            text: "Switch to source editing mode.",
            cls: "x-html-editor-tip"
        }
    }
});
Ext.reg("htmleditor", Ext.form.HtmlEditor);
Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {
    minValue: null,
    maxValue: null,
    minText: "The time in this field must be equal to or after {0}",
    maxText: "The time in this field must be equal to or before {0}",
    invalidText: "{0} is not a valid time",
    format: "g:i A",
    altFormats: "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",
    increment: 15,
    mode: "local",
    triggerAction: "all",
    typeAhead: false,
    initDate: "1/1/2008",
    initComponent: function() {
        Ext.form.TimeField.superclass.initComponent.call(this);
        if (typeof this.minValue == "string") {
            this.minValue = this.parseDate(this.minValue)
        }
        if (typeof this.maxValue == "string") {
            this.maxValue = this.parseDate(this.maxValue)
        }
        if (!this.store) {
            var B = this.parseDate(this.minValue);
            if (!B) {
                B = new Date(this.initDate).clearTime()
            }
            var A = this.parseDate(this.maxValue);
            if (!A) {
                A = new Date(this.initDate).clearTime().add("mi", (24 * 60) - 1)
            }
            var C = [];
            while (B <= A) {
                C.push([B.dateFormat(this.format)]);
                B = B.add("mi", this.increment)
            }
            this.store = new Ext.data.SimpleStore({
                fields: ["text"],
                data: C
            });
            this.displayField = "text"
        }
    },
    getValue: function() {
        var A = Ext.form.TimeField.superclass.getValue.call(this);
        return this.formatDate(this.parseDate(A)) || ""
    },
    setValue: function(A) {
        Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(A)))
    },
    validateValue: Ext.form.DateField.prototype.validateValue,
    parseDate: Ext.form.DateField.prototype.parseDate,
    formatDate: Ext.form.DateField.prototype.formatDate,
    beforeBlur: function() {
        var A = this.parseDate(this.getRawValue());
        if (A) {
            this.setValue(A.dateFormat(this.format))
        }
    }
});
Ext.reg("timefield", Ext.form.TimeField);
Ext.form.Label = Ext.extend(Ext.BoxComponent, {
    onRender: function(B, A) {
        if (!this.el) {
            this.el = document.createElement("label");
            this.el.id = this.getId();
            this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || "");
            if (this.forId) {
                this.el.setAttribute("htmlFor", this.forId)
            }
        }
        Ext.form.Label.superclass.onRender.call(this, B, A)
    },
    setText: function(A, B) {
        this.text = A;
        if (this.rendered) {
            this.el.dom.innerHTML = B !== false ? Ext.util.Format.htmlEncode(A) : A
        }
        return this
    }
});
Ext.reg("label", Ext.form.Label);
Ext.form.Action = function(B, A) {
    this.form = B;
    this.options = A || {}
};
Ext.form.Action.CLIENT_INVALID = "client";
Ext.form.Action.SERVER_INVALID = "server";
Ext.form.Action.CONNECT_FAILURE = "connect";
Ext.form.Action.LOAD_FAILURE = "load";
Ext.form.Action.prototype = {
    type: "default",
    run: function(A) {},
    success: function(A) {},
    handleResponse: function(A) {},
    failure: function(A) {
        this.response = A;
        this.failureType = Ext.form.Action.CONNECT_FAILURE;
        this.form.afterAction(this, false)
    },
    processResponse: function(A) {
        this.response = A;
        if (!A.responseText) {
            return true
        }
        this.result = this.handleResponse(A);
        return this.result
    },
    getUrl: function(C) {
        var A = this.options.url || this.form.url || this.form.el.dom.action;
        if (C) {
            var B = this.getParams();
            if (B) {
                A += (A.indexOf("?") != -1 ? "&": "?") + B
            }
        }
        return A
    },
    getMethod: function() {
        return (this.options.method || this.form.method || this.form.el.dom.method || "POST").toUpperCase()
    },
    getParams: function() {
        var A = this.form.baseParams;
        var B = this.options.params;
        if (B) {
            if (typeof B == "object") {
                B = Ext.urlEncode(Ext.applyIf(B, A))
            } else {
                if (typeof B == "string" && A) {
                    B += "&" + Ext.urlEncode(A)
                }
            }
        } else {
            if (A) {
                B = Ext.urlEncode(A)
            }
        }
        return B
    },
    createCallback: function(A) {
        var A = A || {};
        return {
            success: this.success,
            failure: this.failure,
            scope: this,
            timeout: (A.timeout * 1000) || (this.form.timeout * 1000),
            upload: this.form.fileUpload ? this.success: undefined
        }
    }
};
Ext.form.Action.Submit = function(B, A) {
    Ext.form.Action.Submit.superclass.constructor.call(this, B, A)
};
Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
    type: "submit",
    run: function() {
        var B = this.options;
        var C = this.getMethod();
        var A = C == "GET";
        if (B.clientValidation === false || this.form.isValid()) {
            Ext.Ajax.request(Ext.apply(this.createCallback(B), {
                form: this.form.el.dom,
                url: this.getUrl(A),
                method: C,
                headers: B.headers,
                params: !A ? this.getParams() : null,
                isUpload: this.form.fileUpload
            }))
        } else {
            if (B.clientValidation !== false) {
                this.failureType = Ext.form.Action.CLIENT_INVALID;
                this.form.afterAction(this, false)
            }
        }
    },
    success: function(B) {
        var A = this.processResponse(B);
        if (A === true || A.success) {
            this.form.afterAction(this, true);
            return
        }
        if (A.errors) {
            this.form.markInvalid(A.errors);
            this.failureType = Ext.form.Action.SERVER_INVALID
        }
        this.form.afterAction(this, false)
    },
    handleResponse: function(C) {
        if (this.form.errorReader) {
            var B = this.form.errorReader.read(C);
            var F = [];
            if (B.records) {
                for (var D = 0, A = B.records.length; D < A; D++) {
                    var E = B.records[D];
                    F[D] = E.data
                }
            }
            if (F.length < 1) {
                F = null
            }
            return {
                success: B.success,
                errors: F
            }
        }
        return Ext.decode(C.responseText)
    }
});
Ext.form.Action.Load = function(B, A) {
    Ext.form.Action.Load.superclass.constructor.call(this, B, A);
    this.reader = this.form.reader
};
Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
    type: "load",
    run: function() {
        Ext.Ajax.request(Ext.apply(this.createCallback(this.options), {
            method: this.getMethod(),
            url: this.getUrl(false),
            headers: this.options.headers,
            params: this.getParams()
        }))
    },
    success: function(B) {
        var A = this.processResponse(B);
        if (A === true || !A.success || !A.data) {
            this.failureType = Ext.form.Action.LOAD_FAILURE;
            this.form.afterAction(this, false);
            return
        }
        this.form.clearInvalid();
        this.form.setValues(A.data);
        this.form.afterAction(this, true)
    },
    handleResponse: function(B) {
        if (this.form.reader) {
            var A = this.form.reader.read(B);
            var C = A.records && A.records[0] ? A.records[0].data: null;
            return {
                success: A.success,
                data: C
            }
        }
        return Ext.decode(B.responseText)
    }
});
Ext.form.Action.ACTION_TYPES = {
    "load": Ext.form.Action.Load,
    "submit": Ext.form.Action.Submit
};
Ext.form.VTypes = function() {
    var C = /^[a-zA-Z_]+$/;
    var D = /^[a-zA-Z0-9_]+$/;
    var B = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
    var A = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
    return {
        "email": function(E) {
            return B.test(E)
        },
        "emailText": "This field should be an e-mail address in the format \"user@domain.com\"",
        "emailMask": /[a-z0-9_\.\-@]/i,
        "url": function(E) {
            return A.test(E)
        },
        "urlText": "This field should be a URL in the format \"http:/" + "/www.domain.com\"",
        "alpha": function(E) {
            return C.test(E)
        },
        "alphaText": "This field should only contain letters and _",
        "alphaMask": /[a-z_]/i,
        "alphanum": function(E) {
            return D.test(E)
        },
        "alphanumText": "This field should only contain letters, numbers and _",
        "alphanumMask": /[a-z0-9_]/i
    }
} ();
Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
    ddText: "{0} selected row{1}",
    minColumnWidth: 25,
    trackMouseOver: true,
    enableDragDrop: false,
    enableColumnMove: true,
    enableColumnHide: true,
    enableHdMenu: true,
    stripeRows: false,
    autoExpandColumn: false,
    autoExpandMin: 50,
    autoExpandMax: 1000,
    view: null,
    loadMask: false,
    deferRowRender: true,
    rendered: false,
    viewReady: false,
    stateEvents: ["columnmove", "columnresize", "sortchange"],
    initComponent: function() {
        Ext.grid.GridPanel.superclass.initComponent.call(this);
        this.autoScroll = false;
        this.autoWidth = false;
        if (Ext.isArray(this.columns)) {
            this.colModel = new Ext.grid.ColumnModel(this.columns);
            delete this.columns
        }
        if (this.ds) {
            this.store = this.ds;
            delete this.ds
        }
        if (this.cm) {
            this.colModel = this.cm;
            delete this.cm
        }
        if (this.sm) {
            this.selModel = this.sm;
            delete this.sm
        }
        this.store = Ext.StoreMgr.lookup(this.store);
        this.addEvents("click", "dblclick", "contextmenu", "mousedown", "mouseup", "mouseover", "mouseout", "keypress", "keydown", "cellmousedown", "rowmousedown", "headermousedown", "cellclick", "celldblclick", "rowclick", "rowdblclick", "headerclick", "headerdblclick", "rowcontextmenu", "cellcontextmenu", "headercontextmenu", "bodyscroll", "columnresize", "columnmove", "sortchange")
    },
    onRender: function(C, A) {
        Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
        var D = this.body;
        this.el.addClass("x-grid-panel");
        var B = this.getView();
        B.init(this);
        D.on("mousedown", this.onMouseDown, this);
        D.on("click", this.onClick, this);
        D.on("dblclick", this.onDblClick, this);
        D.on("contextmenu", this.onContextMenu, this);
        D.on("keydown", this.onKeyDown, this);
        this.relayEvents(D, ["mousedown", "mouseup", "mouseover", "mouseout", "keypress"]);
        this.getSelectionModel().init(this);
        this.view.render()
    },
    initEvents: function() {
        Ext.grid.GridPanel.superclass.initEvents.call(this);
        if (this.loadMask) {
            this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({
                store: this.store
            },
            this.loadMask))
        }
    },
    initStateEvents: function() {
        Ext.grid.GridPanel.superclass.initStateEvents.call(this);
        this.colModel.on("hiddenchange", this.saveState, this, {
            delay: 100
        })
    },
    applyState: function(F) {
        var B = this.colModel;
        var E = F.columns;
        if (E) {
            for (var C = 0, A = E.length; C < A; C++) {
                var D = E[C];
                var H = B.getColumnById(D.id);
                if (H) {
                    H.hidden = D.hidden;
                    H.width = D.width;
                    var G = B.getIndexById(D.id);
                    if (G != C) {
                        B.moveColumn(G, C)
                    }
                }
            }
        }
        if (F.sort) {
            this.store[this.store.remoteSort ? "setDefaultSort": "sort"](F.sort.field, F.sort.direction)
        }
    },
    getState: function() {
        var C = {
            columns: []
        };
        for (var B = 0, D; D = this.colModel.config[B]; B++) {
            C.columns[B] = {
                id: D.id,
                width: D.width
            };
            if (D.hidden) {
                C.columns[B].hidden = true
            }
        }
        var A = this.store.getSortState();
        if (A) {
            C.sort = A
        }
        return C
    },
    afterRender: function() {
        Ext.grid.GridPanel.superclass.afterRender.call(this);
        this.view.layout();
        if (this.deferRowRender) {
            this.view.afterRender.defer(10, this.view)
        } else {
            this.view.afterRender()
        }
        this.viewReady = true
    },
    reconfigure: function(A, B) {
        if (this.loadMask) {
            this.loadMask.destroy();
            this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({
                store: A
            },
            this.initialConfig.loadMask))
        }
        this.view.bind(A, B);
        this.store = A;
        this.colModel = B;
        if (this.rendered) {
            this.view.refresh(true)
        }
    },
    onKeyDown: function(A) {
        this.fireEvent("keydown", A)
    },
    onDestroy: function() {
        if (this.rendered) {
            if (this.loadMask) {
                this.loadMask.destroy()
            }
            var A = this.body;
            A.removeAllListeners();
            this.view.destroy();
            A.update("")
        }
        this.colModel.purgeListeners();
        Ext.grid.GridPanel.superclass.onDestroy.call(this)
    },
    processEvent: function(C, E) {
        this.fireEvent(C, E);
        var D = E.getTarget();
        var B = this.view;
        var G = B.findHeaderIndex(D);
        if (G !== false) {
            this.fireEvent("header" + C, this, G, E)
        } else {
            var F = B.findRowIndex(D);
            var A = B.findCellIndex(D);
            if (F !== false) {
                this.fireEvent("row" + C, this, F, E);
                if (A !== false) {
                    this.fireEvent("cell" + C, this, F, A, E)
                }
            }
        }
    },
    onClick: function(A) {
        this.processEvent("click", A)
    },
    onMouseDown: function(A) {
        this.processEvent("mousedown", A)
    },
    onContextMenu: function(B, A) {
        this.processEvent("contextmenu", B)
    },
    onDblClick: function(A) {
        this.processEvent("dblclick", A)
    },
    walkCells: function(J, C, B, E, I) {
        var H = this.colModel,
        F = H.getColumnCount();
        var A = this.store,
        G = A.getCount(),
        D = true;
        if (B < 0) {
            if (C < 0) {
                J--;
                D = false
            }
            while (J >= 0) {
                if (!D) {
                    C = F - 1
                }
                D = false;
                while (C >= 0) {
                    if (E.call(I || this, J, C, H) === true) {
                        return [J, C]
                    }
                    C--
                }
                J--
            }
        } else {
            if (C >= F) {
                J++;
                D = false
            }
            while (J < G) {
                if (!D) {
                    C = 0
                }
                D = false;
                while (C < F) {
                    if (E.call(I || this, J, C, H) === true) {
                        return [J, C]
                    }
                    C++
                }
                J++
            }
        }
        return null
    },
    getSelections: function() {
        return this.selModel.getSelections()
    },
    onResize: function() {
        Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);
        if (this.viewReady) {
            this.view.layout()
        }
    },
    getGridEl: function() {
        return this.body
    },
    stopEditing: function() {},
    getSelectionModel: function() {
        if (!this.selModel) {
            this.selModel = new Ext.grid.RowSelectionModel(this.disableSelection ? {
                selectRow: Ext.emptyFn
            }: null)
        }
        return this.selModel
    },
    getStore: function() {
        return this.store
    },
    getColumnModel: function() {
        return this.colModel
    },
    getView: function() {
        if (!this.view) {
            this.view = new Ext.grid.GridView(this.viewConfig)
        }
        return this.view
    },
    getDragDropText: function() {
        var A = this.selModel.getCount();
        return String.format(this.ddText, A, A == 1 ? "": "s")
    }
});
Ext.reg("grid", Ext.grid.GridPanel);
Ext.grid.GridView = function(A) {
    Ext.apply(this, A);
    this.addEvents("beforerowremoved", "beforerowsinserted", "beforerefresh", "rowremoved", "rowsinserted", "rowupdated", "refresh");
    Ext.grid.GridView.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.GridView, Ext.util.Observable, {
    deferEmptyText: true,
    scrollOffset: 19,
    autoFill: false,
    forceFit: false,
    sortClasses: ["sort-asc", "sort-desc"],
    sortAscText: "Sort Ascending",
    sortDescText: "Sort Descending",
    columnsText: "Columns",
    borderWidth: 2,
    tdClass: "x-grid3-cell",
    hdCls: "x-grid3-hd",
    cellSelectorDepth: 4,
    rowSelectorDepth: 10,
    cellSelector: "td.x-grid3-cell",
    rowSelector: "div.x-grid3-row",
    initTemplates: function() {
        var C = this.templates || {};
        if (!C.master) {
            C.master = new Ext.Template("<div class=\"x-grid3\" hidefocus=\"true\">", "<div class=\"x-grid3-viewport\">", "<div class=\"x-grid3-header\"><div class=\"x-grid3-header-inner\"><div class=\"x-grid3-header-offset\">{header}</div></div><div class=\"x-clear\"></div></div>", "<div class=\"x-grid3-scroller\"><div class=\"x-grid3-body\">{body}</div><a href=\"#\" class=\"x-grid3-focus\" tabIndex=\"-1\"></a></div>", "</div>", "<div class=\"x-grid3-resize-marker\">&#160;</div>", "<div class=\"x-grid3-resize-proxy\">&#160;</div>", "</div>")
        }
        if (!C.header) {
            C.header = new Ext.Template("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"{tstyle}\">", "<thead><tr class=\"x-grid3-hd-row\">{cells}</tr></thead>", "</table>")
        }
        if (!C.hcell) {
            C.hcell = new Ext.Template("<td class=\"x-grid3-hd x-grid3-cell x-grid3-td-{id}\" style=\"{style}\"><div {tooltip} {attr} class=\"x-grid3-hd-inner x-grid3-hd-{id}\" unselectable=\"on\" style=\"{istyle}\">", this.grid.enableHdMenu ? "<a class=\"x-grid3-hd-btn\" href=\"#\"></a>": "", "{value}<img class=\"x-grid3-sort-icon\" src=\"", Ext.BLANK_IMAGE_URL, "\" />", "</div></td>")
        }
        if (!C.body) {
            C.body = new Ext.Template("{rows}")
        }
        if (!C.row) {
            C.row = new Ext.Template("<div class=\"x-grid3-row {alt}\" style=\"{tstyle}\"><table class=\"x-grid3-row-table\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"{tstyle}\">", "<tbody><tr>{cells}</tr>", (this.enableRowBody ? "<tr class=\"x-grid3-row-body-tr\" style=\"{bodyStyle}\"><td colspan=\"{cols}\" class=\"x-grid3-body-cell\" tabIndex=\"0\" hidefocus=\"on\"><div class=\"x-grid3-row-body\">{body}</div></td></tr>": ""), "</tbody></table></div>")
        }
        if (!C.cell) {
            C.cell = new Ext.Template("<td class=\"x-grid3-col x-grid3-cell x-grid3-td-{id} {css}\" style=\"{style}\" tabIndex=\"0\" {cellAttr}>", "<div class=\"x-grid3-cell-inner x-grid3-col-{id}\" unselectable=\"on\" {attr}>{value}</div>", "</td>")
        }
        for (var A in C) {
            var B = C[A];
            if (B && typeof B.compile == "function" && !B.compiled) {
                B.disableFormats = true;
                B.compile()
            }
        }
        this.templates = C;
        this.colRe = new RegExp("x-grid3-td-([^\\s]+)", "")
    },
    fly: function(A) {
        if (!this._flyweight) {
            this._flyweight = new Ext.Element.Flyweight(document.body)
        }
        this._flyweight.dom = A;
        return this._flyweight
    },
    getEditorParent: function(A) {
        return this.scroller.dom
    },
    initElements: function() {
        var C = Ext.Element;
        var B = this.grid.getGridEl().dom.firstChild;
        var A = B.childNodes;
        this.el = new C(B);
        this.mainWrap = new C(A[0]);
        this.mainHd = new C(this.mainWrap.dom.firstChild);
        if (this.grid.hideHeaders) {
            this.mainHd.setDisplayed(false)
        }
        this.innerHd = this.mainHd.dom.firstChild;
        this.scroller = new C(this.mainWrap.dom.childNodes[1]);
        if (this.forceFit) {
            this.scroller.setStyle("overflow-x", "hidden")
        }
        this.mainBody = new C(this.scroller.dom.firstChild);
        this.focusEl = new C(this.scroller.dom.childNodes[1]);
        this.focusEl.swallowEvent("click", true);
        this.resizeMarker = new C(A[1]);
        this.resizeProxy = new C(A[2])
    },
    getRows: function() {
        return this.hasRows() ? this.mainBody.dom.childNodes: []
    },
    findCell: function(A) {
        if (!A) {
            return false
        }
        return this.fly(A).findParent(this.cellSelector, this.cellSelectorDepth)
    },
    findCellIndex: function(C, B) {
        var A = this.findCell(C);
        if (A && (!B || this.fly(A).hasClass(B))) {
            return this.getCellIndex(A)
        }
        return false
    },
    getCellIndex: function(B) {
        if (B) {
            var A = B.className.match(this.colRe);
            if (A && A[1]) {
                return this.cm.getIndexById(A[1])
            }
        }
        return false
    },
    findHeaderCell: function(B) {
        var A = this.findCell(B);
        return A && this.fly(A).hasClass(this.hdCls) ? A: null
    },
    findHeaderIndex: function(A) {
        return this.findCellIndex(A, this.hdCls)
    },
    findRow: function(A) {
        if (!A) {
            return false
        }
        return this.fly(A).findParent(this.rowSelector, this.rowSelectorDepth)
    },
    findRowIndex: function(A) {
        var B = this.findRow(A);
        return B ? B.rowIndex: false
    },
    getRow: function(A) {
        return this.getRows()[A]
    },
    getCell: function(B, A) {
        return this.getRow(B).getElementsByTagName("td")[A]
    },
    getHeaderCell: function(A) {
        return this.mainHd.dom.getElementsByTagName("td")[A]
    },
    addRowClass: function(C, A) {
        var B = this.getRow(C);
        if (B) {
            this.fly(B).addClass(A)
        }
    },
    removeRowClass: function(C, A) {
        var B = this.getRow(C);
        if (B) {
            this.fly(B).removeClass(A)
        }
    },
    removeRow: function(A) {
        Ext.removeNode(this.getRow(A));
        this.focusRow(A)
    },
    removeRows: function(C, A) {
        var B = this.mainBody.dom;
        for (var D = C; D <= A; D++) {
            Ext.removeNode(B.childNodes[C])
        }
        this.focusRow(C)
    },
    getScrollState: function() {
        var A = this.scroller.dom;
        return {
            left: A.scrollLeft,
            top: A.scrollTop
        }
    },
    restoreScroll: function(A) {
        var B = this.scroller.dom;
        B.scrollLeft = A.left;
        B.scrollTop = A.top
    },
    scrollToTop: function() {
        this.scroller.dom.scrollTop = 0;
        this.scroller.dom.scrollLeft = 0
    },
    syncScroll: function() {
        this.syncHeaderScroll();
        var A = this.scroller.dom;
        this.grid.fireEvent("bodyscroll", A.scrollLeft, A.scrollTop)
    },
    syncHeaderScroll: function() {
        var A = this.scroller.dom;
        this.innerHd.scrollLeft = A.scrollLeft;
        this.innerHd.scrollLeft = A.scrollLeft
    },
    updateSortIcon: function(B, A) {
        var D = this.sortClasses;
        var C = this.mainHd.select("td").removeClass(D);
        C.item(B).addClass(D[A == "DESC" ? 1 : 0])
    },
    updateAllColumnWidths: function() {
        var D = this.getTotalWidth();
        var H = this.cm.getColumnCount();
        var F = [];
        for (var B = 0; B < H; B++) {
            F[B] = this.getColumnWidth(B)
        }
        this.innerHd.firstChild.firstChild.style.width = D;
        for (var B = 0; B < H; B++) {
            var C = this.getHeaderCell(B);
            C.style.width = F[B]
        }
        var G = this.getRows();
        for (var B = 0, E = G.length; B < E; B++) {
            G[B].style.width = D;
            G[B].firstChild.style.width = D;
            var I = G[B].firstChild.rows[0];
            for (var A = 0; A < H; A++) {
                I.childNodes[A].style.width = F[A]
            }
        }
        this.onAllColumnWidthsUpdated(F, D)
    },
    updateColumnWidth: function(D, G) {
        var B = this.getColumnWidth(D);
        var C = this.getTotalWidth();
        this.innerHd.firstChild.firstChild.style.width = C;
        var H = this.getHeaderCell(D);
        H.style.width = B;
        var F = this.getRows();
        for (var E = 0, A = F.length; E < A; E++) {
            F[E].style.width = C;
            F[E].firstChild.style.width = C;
            F[E].firstChild.rows[0].childNodes[D].style.width = B
        }
        this.onColumnWidthUpdated(D, B, C)
    },
    updateColumnHidden: function(C, F) {
        var B = this.getTotalWidth();
        this.innerHd.firstChild.firstChild.style.width = B;
        var H = F ? "none": "";
        var G = this.getHeaderCell(C);
        G.style.display = H;
        var E = this.getRows();
        for (var D = 0, A = E.length; D < A; D++) {
            E[D].style.width = B;
            E[D].firstChild.style.width = B;
            E[D].firstChild.rows[0].childNodes[C].style.display = H
        }
        this.onColumnHiddenUpdated(C, F, B);
        delete this.lastViewWidth;
        this.layout()
    },
    doRender: function(E, G, M, A, L, Q) {
        var B = this.templates,
        D = B.cell,
        F = B.row,
        H = L - 1;
        var C = "width:" + this.getTotalWidth() + ";";
        var T = [],
        N,
        U,
        O = {},
        I = {
            tstyle: C
        },
        K;
        for (var P = 0, S = G.length; P < S; P++) {
            K = G[P];
            N = [];
            var J = (P + A);
            for (var R = 0; R < L; R++) {
                U = E[R];
                O.id = U.id;
                O.css = R == 0 ? "x-grid3-cell-first ": (R == H ? "x-grid3-cell-last ": "");
                O.attr = O.cellAttr = "";
                O.value = U.renderer(K.data[U.name], O, K, J, R, M);
                O.style = U.style;
                if (O.value == undefined || O.value === "") {
                    O.value = "&#160;"
                }
                if (K.dirty && typeof K.modified[U.name] !== "undefined") {
                    O.css += " x-grid3-dirty-cell"
                }
                N[N.length] = D.apply(O)
            }
            var V = [];
            if (Q && ((J + 1) % 2 == 0)) {
                V[0] = "x-grid3-row-alt"
            }
            if (K.dirty) {
                V[1] = " x-grid3-dirty-row"
            }
            I.cols = L;
            if (this.getRowClass) {
                V[2] = this.getRowClass(K, J, I, M)
            }
            I.alt = V.join(" ");
            I.cells = N.join("");
            T[T.length] = F.apply(I)
        }
        return T.join("")
    },
    processRows: function(E, D) {
        if (this.ds.getCount() < 1) {
            return
        }
        D = D || !this.grid.stripeRows;
        E = E || 0;
        var I = this.getRows();
        var F = " x-grid3-row-alt ";
        for (var B = E, C = I.length; B < C; B++) {
            var H = I[B];
            H.rowIndex = B;
            if (!D) {
                var A = ((B + 1) % 2 == 0);
                var G = (" " + H.className + " ").indexOf(F) != -1;
                if (A == G) {
                    continue
                }
                if (A) {
                    H.className += " x-grid3-row-alt"
                } else {
                    H.className = H.className.replace("x-grid3-row-alt", "")
                }
            }
        }
    },
    afterRender: function() {
        this.mainBody.dom.innerHTML = this.renderRows();
        this.processRows(0, true);
        if (this.deferEmptyText !== true) {
            this.applyEmptyText()
        }
    },
    renderUI: function() {
        var D = this.renderHeaders();
        var A = this.templates.body.apply({
            rows: ""
        });
        var B = this.templates.master.apply({
            body: A,
            header: D
        });
        var C = this.grid;
        C.getGridEl().dom.innerHTML = B;
        this.initElements();
        Ext.fly(this.innerHd).on("click", this.handleHdDown, this);
        this.mainHd.on("mouseover", this.handleHdOver, this);
        this.mainHd.on("mouseout", this.handleHdOut, this);
        this.mainHd.on("mousemove", this.handleHdMove, this);
        this.scroller.on("scroll", this.syncScroll, this);
        if (C.enableColumnResize !== false) {
            this.splitone = new Ext.grid.GridView.SplitDragZone(C, this.mainHd.dom)
        }
        if (C.enableColumnMove) {
            this.columnDrag = new Ext.grid.GridView.ColumnDragZone(C, this.innerHd);
            this.columnDrop = new Ext.grid.HeaderDropZone(C, this.mainHd.dom)
        }
        if (C.enableHdMenu !== false) {
            if (C.enableColumnHide !== false) {
                this.colMenu = new Ext.menu.Menu({
                    id: C.id + "-hcols-menu"
                });
                this.colMenu.on("beforeshow", this.beforeColMenuShow, this);
                this.colMenu.on("itemclick", this.handleHdMenuClick, this)
            }
            this.hmenu = new Ext.menu.Menu({
                id: C.id + "-hctx"
            });
            this.hmenu.add({
                id: "asc",
                text: this.sortAscText,
                cls: "xg-hmenu-sort-asc"
            },
            {
                id: "desc",
                text: this.sortDescText,
                cls: "xg-hmenu-sort-desc"
            });
            if (C.enableColumnHide !== false) {
                this.hmenu.add("-", {
                    id: "columns",
                    text: this.columnsText,
                    menu: this.colMenu,
                    iconCls: "x-cols-icon"
                })
            }
            this.hmenu.on("itemclick", this.handleHdMenuClick, this)
        }
        if (C.enableDragDrop || C.enableDrag) {
            this.dragZone = new Ext.grid.GridDragZone(C, {
                ddGroup: C.ddGroup || "GridDD"
            })
        }
        this.updateHeaderSortState()
    },
    layout: function() {
        if (!this.mainBody) {
            return
        }
        var C = this.grid;
        var F = C.getGridEl();
        var A = F.getSize(true);
        var B = A.width;
        if (B < 20 || A.height < 20) {
            return
        }
        if (C.autoHeight) {
            this.scroller.dom.style.overflow = "visible"
        } else {
            this.el.setSize(A.width, A.height);
            var E = this.mainHd.getHeight();
            var D = A.height - (E);
            this.scroller.setSize(B, D);
            if (this.innerHd) {
                this.innerHd.style.width = (B) + "px"
            }
        }
        if (this.forceFit) {
            if (this.lastViewWidth != B) {
                this.fitColumns(false, false);
                this.lastViewWidth = B
            }
        } else {
            this.autoExpand();
            this.syncHeaderScroll()
        }
        this.onLayout(B, D)
    },
    onLayout: function(A, B) {},
    onColumnWidthUpdated: function(C, A, B) {},
    onAllColumnWidthsUpdated: function(A, B) {},
    onColumnHiddenUpdated: function(B, C, A) {},
    updateColumnText: function(A, B) {},
    afterMove: function(A) {},
    init: function(A) {
        this.grid = A;
        this.initTemplates();
        this.initData(A.store, A.colModel);
        this.initUI(A)
    },
    getColumnId: function(A) {
        return this.cm.getColumnId(A)
    },
    renderHeaders: function() {
        var C = this.cm,
        F = this.templates;
        var E = F.hcell;
        var B = [],
        H = [],
        G = {};
        for (var D = 0, A = C.getColumnCount(); D < A; D++) {
            G.id = C.getColumnId(D);
            G.value = C.getColumnHeader(D) || "";
            G.style = this.getColumnStyle(D, true);
            G.tooltip = this.getColumnTooltip(D);
            if (C.config[D].align == "right") {
                G.istyle = "padding-right:16px"
            } else {
                delete G.istyle
            }
            B[B.length] = E.apply(G)
        }
        return F.header.apply({
            cells: B.join(""),
            tstyle: "width:" + this.getTotalWidth() + ";"
        })
    },
    getColumnTooltip: function(A) {
        var B = this.cm.getColumnTooltip(A);
        if (B) {
            if (Ext.QuickTips.isEnabled()) {
                return "ext:qtip=\"" + B + "\""
            } else {
                return "title=\"" + B + "\""
            }
        }
        return ""
    },
    beforeUpdate: function() {
        this.grid.stopEditing(true)
    },
    updateHeaders: function() {
        this.innerHd.firstChild.innerHTML = this.renderHeaders()
    },
    focusRow: function(A) {
        this.focusCell(A, 0, false)
    },
    focusCell: function(D, A, C) {
        D = Math.min(D, Math.max(0, this.getRows().length - 1));
        var B = this.ensureVisible(D, A, C);
        this.focusEl.setXY(B || this.scroller.getXY());
        if (Ext.isGecko) {
            this.focusEl.focus()
        } else {
            this.focusEl.focus.defer(1, this.focusEl)
        }
    },
    ensureVisible: function(P, E, D) {
        if (typeof P != "number") {
            P = P.rowIndex
        }
        if (!this.ds) {
            return
        }
        if (P < 0 || P >= this.ds.getCount()) {
            return
        }
        E = (E !== undefined ? E: 0);
        var I = this.getRow(P),
        F;
        if (! (D === false && E === 0)) {
            while (this.cm.isHidden(E)) {
                E++
            }
            F = this.getCell(P, E)
        }
        if (!I) {
            return
        }
        var L = this.scroller.dom;
        var O = 0;
        var C = I,
        M = this.el.dom;
        while (C && C != M) {
            O += C.offsetTop;
            C = C.offsetParent
        }
        O -= this.mainHd.dom.offsetHeight;
        var N = O + I.offsetHeight;
        var A = L.clientHeight;
        var M = parseInt(L.scrollTop, 10);
        var K = M + A;
        if (O < M) {
            L.scrollTop = O
        } else {
            if (N > K) {
                L.scrollTop = N - A
            }
        }
        if (D !== false) {
            var J = parseInt(F.offsetLeft, 10);
            var H = J + F.offsetWidth;
            var G = parseInt(L.scrollLeft, 10);
            var B = G + L.clientWidth;
            if (J < G) {
                L.scrollLeft = J
            } else {
                if (H > B) {
                    L.scrollLeft = H - L.clientWidth
                }
            }
        }
        return F ? Ext.fly(F).getXY() : [L.scrollLeft + this.el.getX(), Ext.fly(I).getY()]
    },
    insertRows: function(A, F, C, E) {
        if (!E && F === 0 && C >= A.getCount() - 1) {
            this.refresh()
        } else {
            if (!E) {
                this.fireEvent("beforerowsinserted", this, F, C)
            }
            var B = this.renderRows(F, C);
            var D = this.getRow(F);
            if (D) {
                Ext.DomHelper.insertHtml("beforeBegin", D, B)
            } else {
                Ext.DomHelper.insertHtml("beforeEnd", this.mainBody.dom, B)
            }
            if (!E) {
                this.fireEvent("rowsinserted", this, F, C);
                this.processRows(F)
            }
        }
        this.focusRow(F)
    },
    deleteRows: function(A, C, B) {
        if (A.getRowCount() < 1) {
            this.refresh()
        } else {
            this.fireEvent("beforerowsdeleted", this, C, B);
            this.removeRows(C, B);
            this.processRows(C);
            this.fireEvent("rowsdeleted", this, C, B)
        }
    },
    getColumnStyle: function(A, C) {
        var B = !C ? (this.cm.config[A].css || "") : "";
        B += "width:" + this.getColumnWidth(A) + ";";
        if (this.cm.isHidden(A)) {
            B += "display:none;"
        }
        var D = this.cm.config[A].align;
        if (D) {
            B += "text-align:" + D + ";"
        }
        return B
    },
    getColumnWidth: function(B) {
        var A = this.cm.getColumnWidth(B);
        if (typeof A == "number") {
            return (Ext.isBorderBox ? A: (A - this.borderWidth > 0 ? A - this.borderWidth: 0)) + "px"
        }
        return A
    },
    getTotalWidth: function() {
        return this.cm.getTotalWidth() + "px"
    },
    fitColumns: function(D, G, E) {
        var F = this.cm,
        S, L, O;
        var R = F.getTotalWidth(false);
        var J = this.grid.getGridEl().getWidth(true) - this.scrollOffset;
        if (J < 20) {
            return
        }
        var B = J - R;
        if (B === 0) {
            return false
        }
        var A = F.getColumnCount(true);
        var P = A - (typeof E == "number" ? 1 : 0);
        if (P === 0) {
            P = 1;
            E = undefined
        }
        var K = F.getColumnCount();
        var I = [];
        var N = 0;
        var M = 0;
        var H;
        for (O = 0; O < K; O++) {
            if (!F.isHidden(O) && !F.isFixed(O) && O !== E) {
                H = F.getColumnWidth(O);
                I.push(O);
                N = O;
                I.push(H);
                M += H
            }
        }
        var C = (J - F.getTotalWidth()) / M;
        while (I.length) {
            H = I.pop();
            O = I.pop();
            F.setColumnWidth(O, Math.max(this.grid.minColumnWidth, Math.floor(H + H * C)), true)
        }
        if ((R = F.getTotalWidth(false)) > J) {
            var Q = P != A ? E: N;
            F.setColumnWidth(Q, Math.max(1, F.getColumnWidth(Q) - (R - J)), true)
        }
        if (D !== true) {
            this.updateAllColumnWidths()
        }
        return true
    },
    autoExpand: function(B) {
        var G = this.grid,
        A = this.cm;
        if (!this.userResized && G.autoExpandColumn) {
            var D = A.getTotalWidth(false);
            var H = this.grid.getGridEl().getWidth(true) - this.scrollOffset;
            if (D != H) {
                var F = A.getIndexById(G.autoExpandColumn);
                var E = A.getColumnWidth(F);
                var C = Math.min(Math.max(((H - D) + E), G.autoExpandMin), G.autoExpandMax);
                if (C != E) {
                    A.setColumnWidth(F, C, true);
                    if (B !== true) {
                        this.updateColumnWidth(F, C)
                    }
                }
            }
        }
    },
    getColumnData: function() {
        var D = [],
        A = this.cm,
        E = A.getColumnCount();
        for (var C = 0; C < E; C++) {
            var B = A.getDataIndex(C);
            D[C] = {
                name: (typeof B == "undefined" ? this.ds.fields.get(C).name: B),
                renderer: A.getRenderer(C),
                id: A.getColumnId(C),
                style: this.getColumnStyle(C)
            }
        }
        return D
    },
    renderRows: function(H, C) {
        var D = this.grid,
        F = D.colModel,
        A = D.store,
        I = D.stripeRows;
        var G = F.getColumnCount();
        if (A.getCount() < 1) {
            return ""
        }
        var E = this.getColumnData();
        H = H || 0;
        C = typeof C == "undefined" ? A.getCount() - 1 : C;
        var B = A.getRange(H, C);
        return this.doRender(E, B, A, H, G, I)
    },
    renderBody: function() {
        var A = this.renderRows();
        return this.templates.body.apply({
            rows: A
        })
    },
    refreshRow: function(B) {
        var D = this.ds,
        C;
        if (typeof B == "number") {
            C = B;
            B = D.getAt(C)
        } else {
            C = D.indexOf(B)
        }
        var A = [];
        this.insertRows(D, C, C, true);
        this.getRow(C).rowIndex = C;
        this.onRemove(D, B, C + 1, true);
        this.fireEvent("rowupdated", this, C, B)
    },
    refresh: function(B) {
        this.fireEvent("beforerefresh", this);
        this.grid.stopEditing(true);
        var A = this.renderBody();
        this.mainBody.update(A);
        if (B === true) {
            this.updateHeaders();
            this.updateHeaderSortState()
        }
        this.processRows(0, true);
        this.layout();
        this.applyEmptyText();
        this.fireEvent("refresh", this)
    },
    applyEmptyText: function() {
        if (this.emptyText && !this.hasRows()) {
            this.mainBody.update("<div class=\"x-grid-empty\">" + this.emptyText + "</div>")
        }
    },
    updateHeaderSortState: function() {
        var B = this.ds.getSortState();
        if (!B) {
            return
        }
        if (!this.sortState || (this.sortState.field != B.field || this.sortState.direction != B.direction)) {
            this.grid.fireEvent("sortchange", this.grid, B)
        }
        this.sortState = B;
        var C = this.cm.findColumnIndex(B.field);
        if (C != -1) {
            var A = B.direction;
            this.updateSortIcon(C, A)
        }
    },
    destroy: function() {
        if (this.colMenu) {
            this.colMenu.removeAll();
            Ext.menu.MenuMgr.unregister(this.colMenu);
            this.colMenu.getEl().remove();
            delete this.colMenu
        }
        if (this.hmenu) {
            this.hmenu.removeAll();
            Ext.menu.MenuMgr.unregister(this.hmenu);
            this.hmenu.getEl().remove();
            delete this.hmenu
        }
        if (this.grid.enableColumnMove) {
            var C = Ext.dd.DDM.ids["gridHeader" + this.grid.getGridEl().id];
            if (C) {
                for (var A in C) {
                    if (!C[A].config.isTarget && C[A].dragElId) {
                        var B = C[A].dragElId;
                        C[A].unreg();
                        Ext.get(B).remove()
                    } else {
                        if (C[A].config.isTarget) {
                            C[A].proxyTop.remove();
                            C[A].proxyBottom.remove();
                            C[A].unreg()
                        }
                    }
                    if (Ext.dd.DDM.locationCache[A]) {
                        delete Ext.dd.DDM.locationCache[A]
                    }
                }
                delete Ext.dd.DDM.ids["gridHeader" + this.grid.getGridEl().id]
            }
        }
        Ext.destroy(this.resizeMarker, this.resizeProxy);
        if (this.dragZone) {
            this.dragZone.unreg()
        }
        this.initData(null, null);
        Ext.EventManager.removeResizeListener(this.onWindowResize, this)
    },
    onDenyColumnHide: function() {},
    render: function() {
        if (this.autoFill) {
            this.fitColumns(true, true)
        } else {
            if (this.forceFit) {
                this.fitColumns(true, false)
            } else {
                if (this.grid.autoExpandColumn) {
                    this.autoExpand(true)
                }
            }
        }
        this.renderUI()
    },
    initData: function(B, A) {
        if (this.ds) {
            this.ds.un("load", this.onLoad, this);
            this.ds.un("datachanged", this.onDataChange, this);
            this.ds.un("add", this.onAdd, this);
            this.ds.un("remove", this.onRemove, this);
            this.ds.un("update", this.onUpdate, this);
            this.ds.un("clear", this.onClear, this)
        }
        if (B) {
            B.on("load", this.onLoad, this);
            B.on("datachanged", this.onDataChange, this);
            B.on("add", this.onAdd, this);
            B.on("remove", this.onRemove, this);
            B.on("update", this.onUpdate, this);
            B.on("clear", this.onClear, this)
        }
        this.ds = B;
        if (this.cm) {
            this.cm.un("configchange", this.onColConfigChange, this);
            this.cm.un("widthchange", this.onColWidthChange, this);
            this.cm.un("headerchange", this.onHeaderChange, this);
            this.cm.un("hiddenchange", this.onHiddenChange, this);
            this.cm.un("columnmoved", this.onColumnMove, this);
            this.cm.un("columnlockchange", this.onColumnLock, this)
        }
        if (A) {
            delete this.lastViewWidth;
            A.on("configchange", this.onColConfigChange, this);
            A.on("widthchange", this.onColWidthChange, this);
            A.on("headerchange", this.onHeaderChange, this);
            A.on("hiddenchange", this.onHiddenChange, this);
            A.on("columnmoved", this.onColumnMove, this);
            A.on("columnlockchange", this.onColumnLock, this)
        }
        this.cm = A
    },
    onDataChange: function() {
        this.refresh();
        this.updateHeaderSortState()
    },
    onClear: function() {
        this.refresh()
    },
    onUpdate: function(B, A) {
        this.refreshRow(A)
    },
    onAdd: function(C, A, B) {
        this.insertRows(C, B, B + (A.length - 1))
    },
    onRemove: function(D, A, B, C) {
        if (C !== true) {
            this.fireEvent("beforerowremoved", this, B, A)
        }
        this.removeRow(B);
        if (C !== true) {
            this.processRows(B);
            this.applyEmptyText();
            this.fireEvent("rowremoved", this, B, A)
        }
    },
    onLoad: function() {
        this.scrollToTop()
    },
    onColWidthChange: function(A, B, C) {
        this.updateColumnWidth(B, C)
    },
    onHeaderChange: function(A, B, C) {
        this.updateHeaders()
    },
    onHiddenChange: function(A, B, C) {
        this.updateColumnHidden(B, C)
    },
    onColumnMove: function(A, D, B) {
        this.indexMap = null;
        var C = this.getScrollState();
        this.refresh(true);
        this.restoreScroll(C);
        this.afterMove(B)
    },
    onColConfigChange: function() {
        delete this.lastViewWidth;
        this.indexMap = null;
        this.refresh(true)
    },
    initUI: function(A) {
        A.on("headerclick", this.onHeaderClick, this);
        if (A.trackMouseOver) {
            A.on("mouseover", this.onRowOver, this);
            A.on("mouseout", this.onRowOut, this)
        }
    },
    initEvents: function() {},
    onHeaderClick: function(B, A) {
        if (this.headersDisabled || !this.cm.isSortable(A)) {
            return
        }
        B.stopEditing(true);
        B.store.sort(this.cm.getDataIndex(A))
    },
    onRowOver: function(B, A) {
        var C;
        if ((C = this.findRowIndex(A)) !== false) {
            this.addRowClass(C, "x-grid3-row-over")
        }
    },
    onRowOut: function(B, A) {
        var C;
        if ((C = this.findRowIndex(A)) !== false && C !== this.findRowIndex(B.getRelatedTarget())) {
            this.removeRowClass(C, "x-grid3-row-over")
        }
    },
    handleWheel: function(A) {
        A.stopPropagation()
    },
    onRowSelect: function(A) {
        this.addRowClass(A, "x-grid3-row-selected")
    },
    onRowDeselect: function(A) {
        this.removeRowClass(A, "x-grid3-row-selected")
    },
    onCellSelect: function(C, B) {
        var A = this.getCell(C, B);
        if (A) {
            this.fly(A).addClass("x-grid3-cell-selected")
        }
    },
    onCellDeselect: function(C, B) {
        var A = this.getCell(C, B);
        if (A) {
            this.fly(A).removeClass("x-grid3-cell-selected")
        }
    },
    onColumnSplitterMoved: function(C, B) {
        this.userResized = true;
        var A = this.grid.colModel;
        A.setColumnWidth(C, B, true);
        if (this.forceFit) {
            this.fitColumns(true, false, C);
            this.updateAllColumnWidths()
        } else {
            this.updateColumnWidth(C, B)
        }
        this.grid.fireEvent("columnresize", C, B)
    },
    handleHdMenuClick: function(C) {
        var B = this.hdCtxIndex;
        var A = this.cm,
        D = this.ds;
        switch (C.id) {
        case "asc":
            D.sort(A.getDataIndex(B), "ASC");
            break;
        case "desc":
            D.sort(A.getDataIndex(B), "DESC");
            break;
        default:
            B = A.getIndexById(C.id.substr(4));
            if (B != -1) {
                if (C.checked && A.getColumnsBy(this.isHideableColumn, this).length <= 1) {
                    this.onDenyColumnHide();
                    return false
                }
                A.setHidden(B, C.checked)
            }
        }
        return true
    },
    isHideableColumn: function(A) {
        return ! A.hidden && !A.fixed
    },
    beforeColMenuShow: function() {
        var A = this.cm,
        C = A.getColumnCount();
        this.colMenu.removeAll();
        for (var B = 0; B < C; B++) {
            if (A.config[B].fixed !== true && A.config[B].hideable !== false) {
                this.colMenu.add(new Ext.menu.CheckItem({
                    id: "col-" + A.getColumnId(B),
                    text: A.getColumnHeader(B),
                    checked: !A.isHidden(B),
                    hideOnClick: false,
                    disabled: A.config[B].hideable === false
                }))
            }
        }
    },
    handleHdDown: function(F, D) {
        if (Ext.fly(D).hasClass("x-grid3-hd-btn")) {
            F.stopEvent();
            var E = this.findHeaderCell(D);
            Ext.fly(E).addClass("x-grid3-hd-menu-open");
            var C = this.getCellIndex(E);
            this.hdCtxIndex = C;
            var B = this.hmenu.items,
            A = this.cm;
            B.get("asc").setDisabled(!A.isSortable(C));
            B.get("desc").setDisabled(!A.isSortable(C));
            this.hmenu.on("hide",
            function() {
                Ext.fly(E).removeClass("x-grid3-hd-menu-open")
            },
            this, {
                single: true
            });
            this.hmenu.show(D, "tl-bl?")
        }
    },
    handleHdOver: function(D, A) {
        var C = this.findHeaderCell(A);
        if (C && !this.headersDisabled) {
            this.activeHd = C;
            this.activeHdIndex = this.getCellIndex(C);
            var B = this.fly(C);
            this.activeHdRegion = B.getRegion();
            if (!this.cm.isMenuDisabled(this.activeHdIndex)) {
                B.addClass("x-grid3-hd-over");
                this.activeHdBtn = B.child(".x-grid3-hd-btn");
                if (this.activeHdBtn) {
                    this.activeHdBtn.dom.style.height = (C.firstChild.offsetHeight - 1) + "px"
                }
            }
        }
    },
    handleHdMove: function(F, D) {
        if (this.activeHd && !this.headersDisabled) {
            var B = this.splitHandleWidth || 5;
            var E = this.activeHdRegion;
            var A = F.getPageX();
            var C = this.activeHd.style;
            if (A - E.left <= B && this.cm.isResizable(this.activeHdIndex - 1)) {
                C.cursor = Ext.isAir ? "move": Ext.isSafari ? "e-resize": "col-resize"
            } else {
                if (E.right - A <= (!this.activeHdBtn ? B: 2) && this.cm.isResizable(this.activeHdIndex)) {
                    C.cursor = Ext.isAir ? "move": Ext.isSafari ? "w-resize": "col-resize"
                } else {
                    C.cursor = ""
                }
            }
        }
    },
    handleHdOut: function(C, A) {
        var B = this.findHeaderCell(A);
        if (B && (!Ext.isIE || !C.within(B, true))) {
            this.activeHd = null;
            this.fly(B).removeClass("x-grid3-hd-over");
            B.style.cursor = ""
        }
    },
    hasRows: function() {
        var A = this.mainBody.dom.firstChild;
        return A && A.className != "x-grid-empty"
    },
    bind: function(A, B) {
        this.initData(A, B)
    }
});
Ext.grid.GridView.SplitDragZone = function(A, B) {
    this.grid = A;
    this.view = A.getView();
    this.marker = this.view.resizeMarker;
    this.proxy = this.view.resizeProxy;
    Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, B, "gridSplitters" + this.grid.getGridEl().id, {
        dragElId: Ext.id(this.proxy.dom),
        resizeFrame: false
    });
    this.scroll = false;
    this.hw = this.view.splitHandleWidth || 5
};
Ext.extend(Ext.grid.GridView.SplitDragZone, Ext.dd.DDProxy, {
    b4StartDrag: function(A, E) {
        this.view.headersDisabled = true;
        var D = this.view.mainWrap.getHeight();
        this.marker.setHeight(D);
        this.marker.show();
        this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), "tl-tl", [ - 2, 0]);
        this.proxy.setHeight(D);
        var B = this.cm.getColumnWidth(this.cellIndex);
        var C = Math.max(B - this.grid.minColumnWidth, 0);
        this.resetConstraints();
        this.setXConstraint(C, 1000);
        this.setYConstraint(0, 0);
        this.minX = A - C;
        this.maxX = A + 1000;
        this.startPos = A;
        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, A, E)
    },
    handleMouseDown: function(A) {
        var H = this.view.findHeaderCell(A.getTarget());
        if (H) {
            var K = this.view.fly(H).getXY(),
            E = K[0],
            D = K[1];
            var I = A.getXY(),
            C = I[0],
            B = I[1];
            var G = H.offsetWidth,
            F = false;
            if ((C - E) <= this.hw) {
                F = -1
            } else {
                if ((E + G) - C <= this.hw) {
                    F = 0
                }
            }
            if (F !== false) {
                this.cm = this.grid.colModel;
                var J = this.view.getCellIndex(H);
                if (F == -1) {
                    if (J + F < 0) {
                        return
                    }
                    while (this.cm.isHidden(J + F)) {--F;
                        if (J + F < 0) {
                            return
                        }
                    }
                }
                this.cellIndex = J + F;
                this.split = H.dom;
                if (this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)) {
                    Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments)
                }
            } else {
                if (this.view.columnDrag) {
                    this.view.columnDrag.callHandleMouseDown(A)
                }
            }
        }
    },
    endDrag: function(D) {
        this.marker.hide();
        var A = this.view;
        var B = Math.max(this.minX, D.getPageX());
        var C = B - this.startPos;
        A.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex) + C);
        setTimeout(function() {
            A.headersDisabled = false
        },
        50)
    },
    autoOffset: function() {
        this.setDelta(0, 0)
    }
});
Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {
    hideGroupedColumn: false,
    showGroupName: true,
    startCollapsed: false,
    enableGrouping: true,
    enableGroupingMenu: true,
    enableNoGroups: true,
    emptyGroupText: "(None)",
    ignoreAdd: false,
    groupTextTpl: "{text}",
    gidSeed: 1000,
    initTemplates: function() {
        Ext.grid.GroupingView.superclass.initTemplates.call(this);
        this.state = {};
        var A = this.grid.getSelectionModel();
        A.on(A.selectRow ? "beforerowselect": "beforecellselect", this.onBeforeRowSelect, this);
        if (!this.startGroup) {
            this.startGroup = new Ext.XTemplate("<div id=\"{groupId}\" class=\"x-grid-group {cls}\">", "<div id=\"{groupId}-hd\" class=\"x-grid-group-hd\" style=\"{style}\"><div>", this.groupTextTpl, "</div></div>", "<div id=\"{groupId}-bd\" class=\"x-grid-group-body\">")
        }
        this.startGroup.compile();
        this.endGroup = "</div></div>"
    },
    findGroup: function(A) {
        return Ext.fly(A).up(".x-grid-group", this.mainBody.dom)
    },
    getGroups: function() {
        return this.hasRows() ? this.mainBody.dom.childNodes: []
    },
    onAdd: function() {
        if (this.enableGrouping && !this.ignoreAdd) {
            var A = this.getScrollState();
            this.refresh();
            this.restoreScroll(A)
        } else {
            if (!this.enableGrouping) {
                Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments)
            }
        }
    },
    onRemove: function(E, A, B, D) {
        Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);
        var C = document.getElementById(A._groupId);
        if (C && C.childNodes[1].childNodes.length < 1) {
            Ext.removeNode(C)
        }
        this.applyEmptyText()
    },
    refreshRow: function(A) {
        if (this.ds.getCount() == 1) {
            this.refresh()
        } else {
            this.isUpdating = true;
            Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);
            this.isUpdating = false
        }
    },
    beforeMenuShow: function() {
        var C = this.getGroupField();
        var B = this.hmenu.items.get("groupBy");
        if (B) {
            B.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false)
        }
        var A = this.hmenu.items.get("showGroups");
        if (A) {
            A.setDisabled(!C && this.cm.config[this.hdCtxIndex].groupable === false);
            A.setChecked( !! C, true)
        }
    },
    renderUI: function() {
        Ext.grid.GroupingView.superclass.renderUI.call(this);
        this.mainBody.on("mousedown", this.interceptMouse, this);
        if (this.enableGroupingMenu && this.hmenu) {
            this.hmenu.add("-", {
                id: "groupBy",
                text: this.groupByText,
                handler: this.onGroupByClick,
                scope: this,
                iconCls: "x-group-by-icon"
            });
            if (this.enableNoGroups) {
                this.hmenu.add({
                    id: "showGroups",
                    text: this.showGroupsText,
                    checked: true,
                    checkHandler: this.onShowGroupsClick,
                    scope: this
                })
            }
            this.hmenu.on("beforeshow", this.beforeMenuShow, this)
        }
    },
    onGroupByClick: function() {
        this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
        this.beforeMenuShow()
    },
    onShowGroupsClick: function(A, B) {
        if (B) {
            this.onGroupByClick()
        } else {
            this.grid.store.clearGrouping()
        }
    },
    toggleGroup: function(C, B) {
        this.grid.stopEditing(true);
        C = Ext.getDom(C);
        var A = Ext.fly(C);
        B = B !== undefined ? B: A.hasClass("x-grid-group-collapsed");
        this.state[A.dom.id] = B;
        A[B ? "removeClass": "addClass"]("x-grid-group-collapsed")
    },
    toggleAllGroups: function(C) {
        var B = this.getGroups();
        for (var D = 0, A = B.length; D < A; D++) {
            this.toggleGroup(B[D], C)
        }
    },
    expandAllGroups: function() {
        this.toggleAllGroups(true)
    },
    collapseAllGroups: function() {
        this.toggleAllGroups(false)
    },
    interceptMouse: function(B) {
        var A = B.getTarget(".x-grid-group-hd", this.mainBody);
        if (A) {
            B.stopEvent();
            this.toggleGroup(A.parentNode)
        }
    },
    getGroup: function(A, D, F, G, B, E) {
        var C = F ? F(A, {},
        D, G, B, E) : String(A);
        if (C === "") {
            C = this.cm.config[B].emptyGroupText || this.emptyGroupText
        }
        return C
    },
    getGroupField: function() {
        return this.grid.store.getGroupState()
    },
    renderRows: function() {
        var A = this.getGroupField();
        var D = !!A;
        if (this.hideGroupedColumn) {
            var B = this.cm.findColumnIndex(A);
            if (!D && this.lastGroupField !== undefined) {
                this.mainBody.update("");
                this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);
                delete this.lastGroupField
            } else {
                if (D && this.lastGroupField === undefined) {
                    this.lastGroupField = A;
                    this.cm.setHidden(B, true)
                } else {
                    if (D && this.lastGroupField !== undefined && A !== this.lastGroupField) {
                        this.mainBody.update("");
                        var C = this.cm.findColumnIndex(this.lastGroupField);
                        this.cm.setHidden(C, false);
                        this.lastGroupField = A;
                        this.cm.setHidden(B, true)
                    }
                }
            }
        }
        return Ext.grid.GroupingView.superclass.renderRows.apply(this, arguments)
    },
    doRender: function(D, G, P, A, O, R) {
        if (G.length < 1) {
            return ""
        }
        var Y = this.getGroupField();
        var N = this.cm.findColumnIndex(Y);
        this.enableGrouping = !!Y;
        if (!this.enableGrouping || this.isUpdating) {
            return Ext.grid.GroupingView.superclass.doRender.apply(this, arguments)
        }
        var H = "width:" + this.getTotalWidth() + ";";
        var Q = this.grid.getGridEl().id;
        var F = this.cm.config[N];
        var B = F.groupRenderer || F.renderer;
        var S = this.showGroupName ? (F.groupName || F.header) + ": ": "";
        var X = [],
        K,
        T,
        U,
        M;
        for (T = 0, U = G.length; T < U; T++) {
            var J = A + T;
            var L = G[T],
            E = L.data[Y],
            V = this.getGroup(E, L, B, J, N, P);
            if (!K || K.group != V) {
                M = Q + "-gp-" + Y + "-" + Ext.util.Format.htmlEncode(V);
                var C = typeof this.state[M] !== "undefined" ? !this.state[M] : this.startCollapsed;
                var I = C ? "x-grid-group-collapsed": "";
                K = {
                    group: V,
                    gvalue: E,
                    text: S + V,
                    groupId: M,
                    startRow: J,
                    rs: [L],
                    cls: I,
                    style: H
                };
                X.push(K)
            } else {
                K.rs.push(L)
            }
            L._groupId = M
        }
        var W = [];
        for (T = 0, U = X.length; T < U; T++) {
            var V = X[T];
            this.doGroupStart(W, V, D, P, O);
            W[W.length] = Ext.grid.GroupingView.superclass.doRender.call(this, D, V.rs, P, V.startRow, O, R);
            this.doGroupEnd(W, V, D, P, O)
        }
        return W.join("")
    },
    getGroupId: function(F) {
        var D = this.grid.getGridEl().id;
        var C = this.getGroupField();
        var E = this.cm.findColumnIndex(C);
        var B = this.cm.config[E];
        var G = B.groupRenderer || B.renderer;
        var A = this.getGroup(F, {
            data: {}
        },
        G, 0, E, this.ds);
        return D + "-gp-" + C + "-" + Ext.util.Format.htmlEncode(F)
    },
    doGroupStart: function(A, D, B, E, C) {
        A[A.length] = this.startGroup.apply(D)
    },
    doGroupEnd: function(A, D, B, E, C) {
        A[A.length] = this.endGroup
    },
    getRows: function() {
        if (!this.enableGrouping) {
            return Ext.grid.GroupingView.superclass.getRows.call(this)
        }
        var G = [];
        var F, C = this.getGroups();
        for (var E = 0, A = C.length; E < A; E++) {
            F = C[E].childNodes[1].childNodes;
            for (var D = 0, B = F.length; D < B; D++) {
                G[G.length] = F[D]
            }
        }
        return G
    },
    updateGroupWidths: function() {
        if (!this.enableGrouping || !this.hasRows()) {
            return
        }
        var C = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth - this.scrollOffset) + "px";
        var B = this.getGroups();
        for (var D = 0, A = B.length; D < A; D++) {
            B[D].firstChild.style.width = C
        }
    },
    onColumnWidthUpdated: function(C, A, B) {
        this.updateGroupWidths()
    },
    onAllColumnWidthsUpdated: function(A, B) {
        this.updateGroupWidths()
    },
    onColumnHiddenUpdated: function(B, C, A) {
        this.updateGroupWidths()
    },
    onLayout: function() {
        this.updateGroupWidths()
    },
    onBeforeRowSelect: function(D, C) {
        if (!this.enableGrouping) {
            return
        }
        var B = this.getRow(C);
        if (B && !B.offsetParent) {
            var A = this.findGroup(B);
            this.toggleGroup(A, true)
        }
    },
    groupByText: "Group By This Field",
    showGroupsText: "Show in Groups"
});
Ext.grid.GroupingView.GROUP_ID = 1000;
Ext.grid.HeaderDragZone = function(A, C, B) {
    this.grid = A;
    this.view = A.getView();
    this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
    Ext.grid.HeaderDragZone.superclass.constructor.call(this, C);
    if (B) {
        this.setHandleElId(Ext.id(C));
        this.setOuterHandleElId(Ext.id(B))
    }
    this.scroll = false
};
Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, {
    maxDragWidth: 120,
    getDragData: function(C) {
        var A = Ext.lib.Event.getTarget(C);
        var B = this.view.findHeaderCell(A);
        if (B) {
            return {
                ddel: B.firstChild,
                header: B
            }
        }
        return false
    },
    onInitDrag: function(A) {
        this.view.headersDisabled = true;
        var B = this.dragData.ddel.cloneNode(true);
        B.id = Ext.id();
        B.style.width = Math.min(this.dragData.header.offsetWidth, this.maxDragWidth) + "px";
        this.proxy.update(B);
        return true
    },
    afterValidDrop: function() {
        var A = this.view;
        setTimeout(function() {
            A.headersDisabled = false
        },
        50)
    },
    afterInvalidDrop: function() {
        var A = this.view;
        setTimeout(function() {
            A.headersDisabled = false
        },
        50)
    }
});
Ext.grid.HeaderDropZone = function(A, C, B) {
    this.grid = A;
    this.view = A.getView();
    this.proxyTop = Ext.DomHelper.append(document.body, {
        cls: "col-move-top",
        html: "&#160;"
    },
    true);
    this.proxyBottom = Ext.DomHelper.append(document.body, {
        cls: "col-move-bottom",
        html: "&#160;"
    },
    true);
    this.proxyTop.hide = this.proxyBottom.hide = function() {
        this.setLeftTop( - 100, -100);
        this.setStyle("visibility", "hidden")
    };
    this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
    Ext.grid.HeaderDropZone.superclass.constructor.call(this, A.getGridEl().dom)
};
Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, {
    proxyOffsets: [ - 4, -9],
    fly: Ext.Element.fly,
    getTargetFromEvent: function(C) {
        var A = Ext.lib.Event.getTarget(C);
        var B = this.view.findCellIndex(A);
        if (B !== false) {
            return this.view.getHeaderCell(B)
        }
    },
    nextVisible: function(C) {
        var B = this.view,
        A = this.grid.colModel;
        C = C.nextSibling;
        while (C) {
            if (!A.isHidden(B.getCellIndex(C))) {
                return C
            }
            C = C.nextSibling
        }
        return null
    },
    prevVisible: function(C) {
        var B = this.view,
        A = this.grid.colModel;
        C = C.prevSibling;
        while (C) {
            if (!A.isHidden(B.getCellIndex(C))) {
                return C
            }
            C = C.prevSibling
        }
        return null
    },
    positionIndicator: function(D, B, E) {
        var H = Ext.lib.Event.getPageX(E);
        var A = Ext.lib.Dom.getRegion(B.firstChild);
        var I, K, G = A.top + this.proxyOffsets[1];
        if ((A.right - H) <= (A.right - A.left) / 2) {
            I = A.right + this.view.borderWidth;
            K = "after"
        } else {
            I = A.left;
            K = "before"
        }
        var F = this.view.getCellIndex(D);
        var J = this.view.getCellIndex(B);
        if (this.grid.colModel.isFixed(J)) {
            return false
        }
        var C = this.grid.colModel.isLocked(J);
        if (K == "after") {
            J++
        }
        if (F < J) {
            J--
        }
        if (F == J && (C == this.grid.colModel.isLocked(F))) {
            return false
        }
        I += this.proxyOffsets[0];
        this.proxyTop.setLeftTop(I, G);
        this.proxyTop.show();
        if (!this.bottomOffset) {
            this.bottomOffset = this.view.mainHd.getHeight()
        }
        this.proxyBottom.setLeftTop(I, G + this.proxyTop.dom.offsetHeight + this.bottomOffset);
        this.proxyBottom.show();
        return K
    },
    onNodeEnter: function(D, A, C, B) {
        if (B.header != D) {
            this.positionIndicator(B.header, D, C)
        }
    },
    onNodeOver: function(E, B, D, C) {
        var A = false;
        if (C.header != E) {
            A = this.positionIndicator(C.header, E, D)
        }
        if (!A) {
            this.proxyTop.hide();
            this.proxyBottom.hide()
        }
        return A ? this.dropAllowed: this.dropNotAllowed
    },
    onNodeOut: function(D, A, C, B) {
        this.proxyTop.hide();
        this.proxyBottom.hide()
    },
    onNodeDrop: function(B, K, F, D) {
        var E = D.header;
        if (E != B) {
            var I = this.grid.colModel;
            var H = Ext.lib.Event.getPageX(F);
            var A = Ext.lib.Dom.getRegion(B.firstChild);
            var L = (A.right - H) <= ((A.right - A.left) / 2) ? "after": "before";
            var G = this.view.getCellIndex(E);
            var J = this.view.getCellIndex(B);
            var C = I.isLocked(J);
            if (L == "after") {
                J++
            }
            if (G < J) {
                J--
            }
            if (G == J && (C == I.isLocked(G))) {
                return false
            }
            I.setLocked(G, C, true);
            I.moveColumn(G, J);
            this.grid.fireEvent("columnmove", G, J);
            return true
        }
        return false
    }
});
Ext.grid.GridView.ColumnDragZone = function(A, B) {
    Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, A, B, null);
    this.proxy.el.addClass("x-grid3-col-dd")
};
Ext.extend(Ext.grid.GridView.ColumnDragZone, Ext.grid.HeaderDragZone, {
    handleMouseDown: function(A) {},
    callHandleMouseDown: function(A) {
        Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, A)
    }
});
Ext.grid.SplitDragZone = function(A, C, B) {
    this.grid = A;
    this.view = A.getView();
    this.proxy = this.view.resizeProxy;
    Ext.grid.SplitDragZone.superclass.constructor.call(this, C, "gridSplitters" + this.grid.getGridEl().id, {
        dragElId: Ext.id(this.proxy.dom),
        resizeFrame: false
    });
    this.setHandleElId(Ext.id(C));
    this.setOuterHandleElId(Ext.id(B));
    this.scroll = false
};
Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, {
    fly: Ext.Element.fly,
    b4StartDrag: function(A, D) {
        this.view.headersDisabled = true;
        this.proxy.setHeight(this.view.mainWrap.getHeight());
        var B = this.cm.getColumnWidth(this.cellIndex);
        var C = Math.max(B - this.grid.minColumnWidth, 0);
        this.resetConstraints();
        this.setXConstraint(C, 1000);
        this.setYConstraint(0, 0);
        this.minX = A - C;
        this.maxX = A + 1000;
        this.startPos = A;
        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, A, D)
    },
    handleMouseDown: function(B) {
        ev = Ext.EventObject.setEvent(B);
        var A = this.fly(ev.getTarget());
        if (A.hasClass("x-grid-split")) {
            this.cellIndex = this.view.getCellIndex(A.dom);
            this.split = A.dom;
            this.cm = this.grid.colModel;
            if (this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)) {
                Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments)
            }
        }
    },
    endDrag: function(C) {
        this.view.headersDisabled = false;
        var A = Math.max(this.minX, Ext.lib.Event.getPageX(C));
        var B = A - this.startPos;
        this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex) + B)
    },
    autoOffset: function() {
        this.setDelta(0, 0)
    }
});
Ext.grid.GridDragZone = function(B, A) {
    this.view = B.getView();
    Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, A);
    if (this.view.lockedBody) {
        this.setHandleElId(Ext.id(this.view.mainBody.dom));
        this.setOuterHandleElId(Ext.id(this.view.lockedBody.dom))
    }
    this.scroll = false;
    this.grid = B;
    this.ddel = document.createElement("div");
    this.ddel.className = "x-grid-dd-wrap"
};
Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
    ddGroup: "GridDD",
    getDragData: function(B) {
        var A = Ext.lib.Event.getTarget(B);
        var D = this.view.findRowIndex(A);
        if (D !== false) {
            var C = this.grid.selModel;
            if (!C.isSelected(D) || B.hasModifier()) {
                C.handleMouseDown(this.grid, D, B)
            }
            return {
                grid: this.grid,
                ddel: this.ddel,
                rowIndex: D,
                selections: C.getSelections()
            }
        }
        return false
    },
    onInitDrag: function(B) {
        var A = this.dragData;
        this.ddel.innerHTML = this.grid.getDragDropText();
        this.proxy.update(this.ddel)
    },
    afterRepair: function() {
        this.dragging = false
    },
    getRepairXY: function(B, A) {
        return false
    },
    onEndDrag: function(A, B) {},
    onValidDrop: function(A, B, C) {
        this.hideProxy()
    },
    beforeInvalidDrop: function(A, B) {}
});
Ext.grid.ColumnModel = function(A) {
    this.defaultWidth = 100;
    this.defaultSortable = false;
    if (A.columns) {
        Ext.apply(this, A);
        this.setConfig(A.columns, true)
    } else {
        this.setConfig(A, true)
    }
    this.addEvents("widthchange", "headerchange", "hiddenchange", "columnmoved", "columnlockchange", "configchange");
    Ext.grid.ColumnModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, {
    getColumnId: function(A) {
        return this.config[A].id
    },
    setConfig: function(C, B) {
        if (!B) {
            delete this.totalWidth;
            for (var D = 0, A = this.config.length; D < A; D++) {
                var E = this.config[D];
                if (E.editor) {
                    E.editor.destroy()
                }
            }
        }
        this.config = C;
        this.lookup = {};
        for (var D = 0, A = C.length; D < A; D++) {
            var E = C[D];
            if (typeof E.renderer == "string") {
                E.renderer = Ext.util.Format[E.renderer]
            }
            if (typeof E.id == "undefined") {
                E.id = D
            }
            if (E.editor && E.editor.isFormField) {
                E.editor = new Ext.grid.GridEditor(E.editor)
            }
            this.lookup[E.id] = E
        }
        if (!B) {
            this.fireEvent("configchange", this)
        }
    },
    getColumnById: function(A) {
        return this.lookup[A]
    },
    getIndexById: function(C) {
        for (var B = 0, A = this.config.length; B < A; B++) {
            if (this.config[B].id == C) {
                return B
            }
        }
        return - 1
    },
    moveColumn: function(C, A) {
        var B = this.config[C];
        this.config.splice(C, 1);
        this.config.splice(A, 0, B);
        this.dataMap = null;
        this.fireEvent("columnmoved", this, C, A)
    },
    isLocked: function(A) {
        return this.config[A].locked === true
    },
    setLocked: function(B, C, A) {
        if (this.isLocked(B) == C) {
            return
        }
        this.config[B].locked = C;
        if (!A) {
            this.fireEvent("columnlockchange", this, B, C)
        }
    },
    getTotalLockedWidth: function() {
        var A = 0;
        for (var B = 0; B < this.config.length; B++) {
            if (this.isLocked(B) && !this.isHidden(B)) {
                this.totalWidth += this.getColumnWidth(B)
            }
        }
        return A
    },
    getLockedCount: function() {
        for (var B = 0, A = this.config.length; B < A; B++) {
            if (!this.isLocked(B)) {
                return B
            }
        }
    },
    getColumnCount: function(C) {
        if (C === true) {
            var D = 0;
            for (var B = 0, A = this.config.length; B < A; B++) {
                if (!this.isHidden(B)) {
                    D++
                }
            }
            return D
        }
        return this.config.length
    },
    getColumnsBy: function(D, C) {
        var E = [];
        for (var B = 0, A = this.config.length; B < A; B++) {
            var F = this.config[B];
            if (D.call(C || this, F, B) === true) {
                E[E.length] = F
            }
        }
        return E
    },
    isSortable: function(A) {
        if (typeof this.config[A].sortable == "undefined") {
            return this.defaultSortable
        }
        return this.config[A].sortable
    },
    isMenuDisabled: function(A) {
        return !! this.config[A].menuDisabled
    },
    getRenderer: function(A) {
        if (!this.config[A].renderer) {
            return Ext.grid.ColumnModel.defaultRenderer
        }
        return this.config[A].renderer
    },
    setRenderer: function(A, B) {
        this.config[A].renderer = B
    },
    getColumnWidth: function(A) {
        return this.config[A].width || this.defaultWidth
    },
    setColumnWidth: function(B, C, A) {
        this.config[B].width = C;
        this.totalWidth = null;
        if (!A) {
            this.fireEvent("widthchange", this, B, C)
        }
    },
    getTotalWidth: function(B) {
        if (!this.totalWidth) {
            this.totalWidth = 0;
            for (var C = 0, A = this.config.length; C < A; C++) {
                if (B || !this.isHidden(C)) {
                    this.totalWidth += this.getColumnWidth(C)
                }
            }
        }
        return this.totalWidth
    },
    getColumnHeader: function(A) {
        return this.config[A].header
    },
    setColumnHeader: function(A, B) {
        this.config[A].header = B;
        this.fireEvent("headerchange", this, A, B)
    },
    getColumnTooltip: function(A) {
        return this.config[A].tooltip
    },
    setColumnTooltip: function(A, B) {
        this.config[A].tooltip = B
    },
    getDataIndex: function(A) {
        return this.config[A].dataIndex
    },
    setDataIndex: function(A, B) {
        this.config[A].dataIndex = B
    },
    findColumnIndex: function(C) {
        var D = this.config;
        for (var B = 0, A = D.length; B < A; B++) {
            if (D[B].dataIndex == C) {
                return B
            }
        }
        return - 1
    },
    isCellEditable: function(A, B) {
        return (this.config[A].editable || (typeof this.config[A].editable == "undefined" && this.config[A].editor)) ? true: false
    },
    getCellEditor: function(A, B) {
        return this.config[A].editor
    },
    setEditable: function(A, B) {
        this.config[A].editable = B
    },
    isHidden: function(A) {
        return this.config[A].hidden
    },
    isFixed: function(A) {
        return this.config[A].fixed
    },
    isResizable: function(A) {
        return A >= 0 && this.config[A].resizable !== false && this.config[A].fixed !== true
    },
    setHidden: function(A, B) {
        var C = this.config[A];
        if (C.hidden !== B) {
            C.hidden = B;
            this.totalWidth = null;
            this.fireEvent("hiddenchange", this, A, B)
        }
    },
    setEditor: function(A, B) {
        this.config[A].editor = B
    }
});
Ext.grid.ColumnModel.defaultRenderer = function(A) {
    if (typeof A == "string" && A.length < 1) {
        return "&#160;"
    }
    return A
};
Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel;
Ext.grid.AbstractSelectionModel = function() {
    this.locked = false;
    Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable, {
    init: function(A) {
        this.grid = A;
        this.initEvents()
    },
    lock: function() {
        this.locked = true
    },
    unlock: function() {
        this.locked = false
    },
    isLocked: function() {
        return this.locked
    }
});
Ext.grid.RowSelectionModel = function(A) {
    Ext.apply(this, A);
    this.selections = new Ext.util.MixedCollection(false,
    function(B) {
        return B.id
    });
    this.last = false;
    this.lastActive = false;
    this.addEvents("selectionchange", "beforerowselect", "rowselect", "rowdeselect");
    Ext.grid.RowSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, {
    singleSelect: false,
    initEvents: function() {
        if (!this.grid.enableDragDrop && !this.grid.enableDrag) {
            this.grid.on("rowmousedown", this.handleMouseDown, this)
        } else {
            this.grid.on("rowclick",
            function(B, D, C) {
                if (C.button === 0 && !C.shiftKey && !C.ctrlKey) {
                    this.selectRow(D, false);
                    B.view.focusRow(D)
                }
            },
            this)
        }
        this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {
            "up": function(C) {
                if (!C.shiftKey) {
                    this.selectPrevious(C.shiftKey)
                } else {
                    if (this.last !== false && this.lastActive !== false) {
                        var B = this.last;
                        this.selectRange(this.last, this.lastActive - 1);
                        this.grid.getView().focusRow(this.lastActive);
                        if (B !== false) {
                            this.last = B
                        }
                    } else {
                        this.selectFirstRow()
                    }
                }
            },
            "down": function(C) {
                if (!C.shiftKey) {
                    this.selectNext(C.shiftKey)
                } else {
                    if (this.last !== false && this.lastActive !== false) {
                        var B = this.last;
                        this.selectRange(this.last, this.lastActive + 1);
                        this.grid.getView().focusRow(this.lastActive);
                        if (B !== false) {
                            this.last = B
                        }
                    } else {
                        this.selectFirstRow()
                    }
                }
            },
            scope: this
        });
        var A = this.grid.view;
        A.on("refresh", this.onRefresh, this);
        A.on("rowupdated", this.onRowUpdated, this);
        A.on("rowremoved", this.onRemove, this)
    },
    onRefresh: function() {
        var F = this.grid.store,
        B;
        var D = this.getSelections();
        this.clearSelections(true);
        for (var C = 0, A = D.length; C < A; C++) {
            var E = D[C];
            if ((B = F.indexOfId(E.id)) != -1) {
                this.selectRow(B, true)
            }
        }
        if (D.length != this.selections.getCount()) {
            this.fireEvent("selectionchange", this)
        }
    },
    onRemove: function(A, B, C) {
        if (this.selections.remove(C) !== false) {
            this.fireEvent("selectionchange", this)
        }
    },
    onRowUpdated: function(A, B, C) {
        if (this.isSelected(C)) {
            A.onRowSelect(B)
        }
    },
    selectRecords: function(B, E) {
        if (!E) {
            this.clearSelections()
        }
        var D = this.grid.store;
        for (var C = 0, A = B.length; C < A; C++) {
            this.selectRow(D.indexOf(B[C]), true)
        }
    },
    getCount: function() {
        return this.selections.length
    },
    selectFirstRow: function() {
        this.selectRow(0)
    },
    selectLastRow: function(A) {
        this.selectRow(this.grid.store.getCount() - 1, A)
    },
    selectNext: function(A) {
        if (this.hasNext()) {
            this.selectRow(this.last + 1, A);
            this.grid.getView().focusRow(this.last);
            return true
        }
        return false
    },
    selectPrevious: function(A) {
        if (this.hasPrevious()) {
            this.selectRow(this.last - 1, A);
            this.grid.getView().focusRow(this.last);
            return true
        }
        return false
    },
    hasNext: function() {
        return this.last !== false && (this.last + 1) < this.grid.store.getCount()
    },
    hasPrevious: function() {
        return !! this.last
    },
    getSelections: function() {
        return [].concat(this.selections.items)
    },
    getSelected: function() {
        return this.selections.itemAt(0)
    },
    each: function(E, D) {
        var C = this.getSelections();
        for (var B = 0, A = C.length; B < A; B++) {
            if (E.call(D || this, C[B], B) === false) {
                return false
            }
        }
        return true
    },
    clearSelections: function(A) {
        if (this.locked) {
            return
        }
        if (A !== true) {
            var C = this.grid.store;
            var B = this.selections;
            B.each(function(D) {
                this.deselectRow(C.indexOfId(D.id))
            },
            this);
            B.clear()
        } else {
            this.selections.clear()
        }
        this.last = false
    },
    selectAll: function() {
        if (this.locked) {
            return
        }
        this.selections.clear();
        for (var B = 0, A = this.grid.store.getCount(); B < A; B++) {
            this.selectRow(B, true)
        }
    },
    hasSelection: function() {
        return this.selections.length > 0
    },
    isSelected: function(A) {
        var B = typeof A == "number" ? this.grid.store.getAt(A) : A;
        return (B && this.selections.key(B.id) ? true: false)
    },
    isIdSelected: function(A) {
        return (this.selections.key(A) ? true: false)
    },
    handleMouseDown: function(D, F, E) {
        if (E.button !== 0 || this.isLocked()) {
            return
        }
        var A = this.grid.getView();
        if (E.shiftKey && this.last !== false) {
            var C = this.last;
            this.selectRange(C, F, E.ctrlKey);
            this.last = C;
            A.focusRow(F)
        } else {
            var B = this.isSelected(F);
            if (E.ctrlKey && B) {
                this.deselectRow(F)
            } else {
                if (!B || this.getCount() > 1) {
                    this.selectRow(F, E.ctrlKey || E.shiftKey);
                    A.focusRow(F)
                }
            }
        }
    },
    selectRows: function(C, D) {
        if (!D) {
            this.clearSelections()
        }
        for (var B = 0, A = C.length; B < A; B++) {
            this.selectRow(C[B], true)
        }
    },
    selectRange: function(B, A, D) {
        if (this.locked) {
            return
        }
        if (!D) {
            this.clearSelections()
        }
        if (B <= A) {
            for (var C = B; C <= A; C++) {
                this.selectRow(C, true)
            }
        } else {
            for (var C = B; C >= A; C--) {
                this.selectRow(C, true)
            }
        }
    },
    deselectRange: function(C, B, A) {
        if (this.locked) {
            return
        }
        for (var D = C; D <= B; D++) {
            this.deselectRow(D, A)
        }
    },
    selectRow: function(B, D, A) {
        if (this.locked || (B < 0 || B >= this.grid.store.getCount()) || this.isSelected(B)) {
            return
        }
        var C = this.grid.store.getAt(B);
        if (C && this.fireEvent("beforerowselect", this, B, D, C) !== false) {
            if (!D || this.singleSelect) {
                this.clearSelections()
            }
            this.selections.add(C);
            this.last = this.lastActive = B;
            if (!A) {
                this.grid.getView().onRowSelect(B)
            }
            this.fireEvent("rowselect", this, B, C);
            this.fireEvent("selectionchange", this)
        }
    },
    deselectRow: function(B, A) {
        if (this.locked) {
            return
        }
        if (this.last == B) {
            this.last = false
        }
        if (this.lastActive == B) {
            this.lastActive = false
        }
        var C = this.grid.store.getAt(B);
        if (C) {
            this.selections.remove(C);
            if (!A) {
                this.grid.getView().onRowDeselect(B)
            }
            this.fireEvent("rowdeselect", this, B, C);
            this.fireEvent("selectionchange", this)
        }
    },
    restoreLast: function() {
        if (this._last) {
            this.last = this._last
        }
    },
    acceptsNav: function(C, B, A) {
        return ! A.isHidden(B) && A.isCellEditable(B, C)
    },
    onEditorKey: function(F, E) {
        var C = E.getKey(),
        G,
        D = this.grid,
        B = D.activeEditor;
        var A = E.shiftKey;
        if (C == E.TAB) {
            E.stopEvent();
            B.completeEdit();
            if (A) {
                G = D.walkCells(B.row, B.col - 1, -1, this.acceptsNav, this)
            } else {
                G = D.walkCells(B.row, B.col + 1, 1, this.acceptsNav, this)
            }
        } else {
            if (C == E.ENTER) {
                E.stopEvent();
                B.completeEdit();
                if (this.moveEditorOnEnter !== false) {
                    if (A) {
                        G = D.walkCells(B.row - 1, B.col, -1, this.acceptsNav, this)
                    } else {
                        G = D.walkCells(B.row + 1, B.col, 1, this.acceptsNav, this)
                    }
                }
            } else {
                if (C == E.ESC) {
                    B.cancelEdit()
                }
            }
        }
        if (G) {
            D.startEditing(G[0], G[1])
        }
    }
});
Ext.grid.CellSelectionModel = function(A) {
    Ext.apply(this, A);
    this.selection = null;
    this.addEvents("beforecellselect", "cellselect", "selectionchange");
    Ext.grid.CellSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, {
    initEvents: function() {
        this.grid.on("cellmousedown", this.handleMouseDown, this);
        this.grid.getGridEl().on(Ext.isIE || Ext.isSafari3 ? "keydown": "keypress", this.handleKeyDown, this);
        var A = this.grid.view;
        A.on("refresh", this.onViewChange, this);
        A.on("rowupdated", this.onRowUpdated, this);
        A.on("beforerowremoved", this.clearSelections, this);
        A.on("beforerowsinserted", this.clearSelections, this);
        if (this.grid.isEditor) {
            this.grid.on("beforeedit", this.beforeEdit, this)
        }
    },
    beforeEdit: function(A) {
        this.select(A.row, A.column, false, true, A.record)
    },
    onRowUpdated: function(A, B, C) {
        if (this.selection && this.selection.record == C) {
            A.onCellSelect(B, this.selection.cell[1])
        }
    },
    onViewChange: function() {
        this.clearSelections(true)
    },
    getSelectedCell: function() {
        return this.selection ? this.selection.cell: null
    },
    clearSelections: function(B) {
        var A = this.selection;
        if (A) {
            if (B !== true) {
                this.grid.view.onCellDeselect(A.cell[0], A.cell[1])
            }
            this.selection = null;
            this.fireEvent("selectionchange", this, null)
        }
    },
    hasSelection: function() {
        return this.selection ? true: false
    },
    handleMouseDown: function(B, D, A, C) {
        if (C.button !== 0 || this.isLocked()) {
            return
        }
        this.select(D, A)
    },
    select: function(F, C, B, E, D) {
        if (this.fireEvent("beforecellselect", this, F, C) !== false) {
            this.clearSelections();
            D = D || this.grid.store.getAt(F);
            this.selection = {
                record: D,
                cell: [F, C]
            };
            if (!B) {
                var A = this.grid.getView();
                A.onCellSelect(F, C);
                if (E !== true) {
                    A.focusCell(F, C)
                }
            }
            this.fireEvent("cellselect", this, F, C);
            this.fireEvent("selectionchange", this, this.selection)
        }
    },
    isSelectable: function(C, B, A) {
        return ! A.isHidden(B)
    },
    handleKeyDown: function(F) {
        if (!F.isNavKeyPress()) {
            return
        }
        var E = this.grid,
        J = this.selection;
        if (!J) {
            F.stopEvent();
            var I = E.walkCells(0, 0, 1, this.isSelectable, this);
            if (I) {
                this.select(I[0], I[1])
            }
            return
        }
        var B = this;
        var H = function(M, K, L) {
            return E.walkCells(M, K, L, B.isSelectable, B)
        };
        var C = F.getKey(),
        A = J.cell[0],
        G = J.cell[1];
        var D;
        switch (C) {
        case F.TAB:
            if (F.shiftKey) {
                D = H(A, G - 1, -1)
            } else {
                D = H(A, G + 1, 1)
            }
            break;
        case F.DOWN:
            D = H(A + 1, G, 1);
            break;
        case F.UP:
            D = H(A - 1, G, -1);
            break;
        case F.RIGHT:
            D = H(A, G + 1, 1);
            break;
        case F.LEFT:
            D = H(A, G - 1, -1);
            break;
        case F.ENTER:
            if (E.isEditor && !E.editing) {
                E.startEditing(A, G);
                F.stopEvent();
                return
            }
            break
        }
        if (D) {
            this.select(D[0], D[1]);
            F.stopEvent()
        }
    },
    acceptsNav: function(C, B, A) {
        return ! A.isHidden(B) && A.isCellEditable(B, C)
    },
    onEditorKey: function(E, D) {
        var B = D.getKey(),
        F,
        C = this.grid,
        A = C.activeEditor;
        if (B == D.TAB) {
            if (D.shiftKey) {
                F = C.walkCells(A.row, A.col - 1, -1, this.acceptsNav, this)
            } else {
                F = C.walkCells(A.row, A.col + 1, 1, this.acceptsNav, this)
            }
            D.stopEvent()
        } else {
            if (B == D.ENTER) {
                A.completeEdit();
                D.stopEvent()
            } else {
                if (B == D.ESC) {
                    D.stopEvent();
                    A.cancelEdit()
                }
            }
        }
        if (F) {
            C.startEditing(F[0], F[1])
        }
    }
});
Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
    clicksToEdit: 2,
    isEditor: true,
    detectEdit: false,
    autoEncode: false,
    trackMouseOver: false,
    initComponent: function() {
        Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
        if (!this.selModel) {
            this.selModel = new Ext.grid.CellSelectionModel()
        }
        this.activeEditor = null;
        this.addEvents("beforeedit", "afteredit", "validateedit")
    },
    initEvents: function() {
        Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
        this.on("bodyscroll", this.stopEditing, this, [true]);
        if (this.clicksToEdit == 1) {
            this.on("cellclick", this.onCellDblClick, this)
        } else {
            if (this.clicksToEdit == "auto" && this.view.mainBody) {
                this.view.mainBody.on("mousedown", this.onAutoEditClick, this)
            }
            this.on("celldblclick", this.onCellDblClick, this)
        }
        this.getGridEl().addClass("xedit-grid")
    },
    onCellDblClick: function(B, C, A) {
        this.startEditing(C, A)
    },
    onAutoEditClick: function(C, B) {
        if (C.button !== 0) {
            return
        }
        var E = this.view.findRowIndex(B);
        var A = this.view.findCellIndex(B);
        if (E !== false && A !== false) {
            this.stopEditing();
            if (this.selModel.getSelectedCell) {
                var D = this.selModel.getSelectedCell();
                if (D && D.cell[0] === E && D.cell[1] === A) {
                    this.startEditing(E, A)
                }
            } else {
                if (this.selModel.isSelected(E)) {
                    this.startEditing(E, A)
                }
            }
        }
    },
    onEditComplete: function(B, D, A) {
        this.editing = false;
        this.activeEditor = null;
        B.un("specialkey", this.selModel.onEditorKey, this.selModel);
        var C = B.record;
        var F = this.colModel.getDataIndex(B.col);
        D = this.postEditValue(D, A, C, F);
        if (String(D) !== String(A)) {
            var E = {
                grid: this,
                record: C,
                field: F,
                originalValue: A,
                value: D,
                row: B.row,
                column: B.col,
                cancel: false
            };
            if (this.fireEvent("validateedit", E) !== false && !E.cancel) {
                C.set(F, E.value);
                delete E.cancel;
                this.fireEvent("afteredit", E)
            }
        }
        this.view.focusCell(B.row, B.col)
    },
    startEditing: function(F, B) {
        this.stopEditing();
        if (this.colModel.isCellEditable(B, F)) {
            this.view.ensureVisible(F, B, true);
            var C = this.store.getAt(F);
            var E = this.colModel.getDataIndex(B);
            var D = {
                grid: this,
                record: C,
                field: E,
                value: C.data[E],
                row: F,
                column: B,
                cancel: false
            };
            if (this.fireEvent("beforeedit", D) !== false && !D.cancel) {
                this.editing = true;
                var A = this.colModel.getCellEditor(B, F);
                if (!A.rendered) {
                    A.render(this.view.getEditorParent(A))
                } (function() {
                    A.row = F;
                    A.col = B;
                    A.record = C;
                    A.on("complete", this.onEditComplete, this, {
                        single: true
                    });
                    A.on("specialkey", this.selModel.onEditorKey, this.selModel);
                    this.activeEditor = A;
                    var G = this.preEditValue(C, E);
                    A.startEdit(this.view.getCell(F, B).firstChild, G)
                }).defer(50, this)
            }
        }
    },
    preEditValue: function(A, C) {
        var B = A.data[C];
        return this.autoEncode && typeof B == "string" ? Ext.util.Format.htmlDecode(B) : B
    },
    postEditValue: function(C, A, B, D) {
        return this.autoEncode && typeof C == "string" ? Ext.util.Format.htmlEncode(C) : C
    },
    stopEditing: function(A) {
        if (this.activeEditor) {
            this.activeEditor[A === true ? "cancelEdit": "completeEdit"]()
        }
        this.activeEditor = null
    },
    onDestroy: function() {
        if (this.rendered) {
            var C = this.colModel.config;
            for (var B = 0, A = C.length; B < A; B++) {
                var D = C[B];
                Ext.destroy(D.editor)
            }
        }
        Ext.grid.EditorGridPanel.superclass.onDestroy.call(this)
    }
});
Ext.reg("editorgrid", Ext.grid.EditorGridPanel);
Ext.grid.GridEditor = function(B, A) {
    Ext.grid.GridEditor.superclass.constructor.call(this, B, A);
    B.monitorTab = false
};
Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
    alignment: "tl-tl",
    autoSize: "width",
    hideEl: false,
    cls: "x-small-editor x-grid-editor",
    shim: false,
    shadow: false
});
Ext.grid.PropertyRecord = Ext.data.Record.create([{
    name: "name",
    type: "string"
},
"value"]);
Ext.grid.PropertyStore = function(A, B) {
    this.grid = A;
    this.store = new Ext.data.Store({
        recordType: Ext.grid.PropertyRecord
    });
    this.store.on("update", this.onUpdate, this);
    if (B) {
        this.setSource(B)
    }
    Ext.grid.PropertyStore.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, {
    setSource: function(C) {
        this.source = C;
        this.store.removeAll();
        var B = [];
        for (var A in C) {
            if (this.isEditableValue(C[A])) {
                B.push(new Ext.grid.PropertyRecord({
                    name: A,
                    value: C[A]
                },
                A))
            }
        }
        this.store.loadRecords({
            records: B
        },
        {},
        true)
    },
    onUpdate: function(E, A, D) {
        if (D == Ext.data.Record.EDIT) {
            var B = A.data["value"];
            var C = A.modified["value"];
            if (this.grid.fireEvent("beforepropertychange", this.source, A.id, B, C) !== false) {
                this.source[A.id] = B;
                A.commit();
                this.grid.fireEvent("propertychange", this.source, A.id, B, C)
            } else {
                A.reject()
            }
        }
    },
    getProperty: function(A) {
        return this.store.getAt(A)
    },
    isEditableValue: function(A) {
        if (Ext.isDate(A)) {
            return true
        } else {
            if (typeof A == "object" || typeof A == "function") {
                return false
            }
        }
        return true
    },
    setValue: function(B, A) {
        this.source[B] = A;
        this.store.getById(B).set("value", A)
    },
    getSource: function() {
        return this.source
    }
});
Ext.grid.PropertyColumnModel = function(C, B) {
    this.grid = C;
    var D = Ext.grid;
    D.PropertyColumnModel.superclass.constructor.call(this, [{
        header: this.nameText,
        width: 50,
        sortable: true,
        dataIndex: "name",
        id: "name",
        menuDisabled: true
    },
    {
        header: this.valueText,
        width: 50,
        resizable: false,
        dataIndex: "value",
        id: "value",
        menuDisabled: true
    }]);
    this.store = B;
    this.bselect = Ext.DomHelper.append(document.body, {
        tag: "select",
        cls: "x-grid-editor x-hide-display",
        children: [{
            tag: "option",
            value: "true",
            html: "true"
        },
        {
            tag: "option",
            value: "false",
            html: "false"
        }]
    });
    var E = Ext.form;
    var A = new E.Field({
        el: this.bselect,
        bselect: this.bselect,
        autoShow: true,
        getValue: function() {
            return this.bselect.value == "true"
        }
    });
    this.editors = {
        "date": new D.GridEditor(new E.DateField({
            selectOnFocus: true
        })),
        "string": new D.GridEditor(new E.TextField({
            selectOnFocus: true
        })),
        "number": new D.GridEditor(new E.NumberField({
            selectOnFocus: true,
            style: "text-align:left;"
        })),
        "boolean": new D.GridEditor(A)
    };
    this.renderCellDelegate = this.renderCell.createDelegate(this);
    this.renderPropDelegate = this.renderProp.createDelegate(this)
};
Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, {
    nameText: "Name",
    valueText: "Value",
    dateFormat: "m/j/Y",
    renderDate: function(A) {
        return A.dateFormat(this.dateFormat)
    },
    renderBool: function(A) {
        return A ? "true": "false"
    },
    isCellEditable: function(A, B) {
        return A == 1
    },
    getRenderer: function(A) {
        return A == 1 ? this.renderCellDelegate: this.renderPropDelegate
    },
    renderProp: function(A) {
        return this.getPropertyName(A)
    },
    renderCell: function(A) {
        var B = A;
        if (Ext.isDate(A)) {
            B = this.renderDate(A)
        } else {
            if (typeof A == "boolean") {
                B = this.renderBool(A)
            }
        }
        return Ext.util.Format.htmlEncode(B)
    },
    getPropertyName: function(B) {
        var A = this.grid.propertyNames;
        return A && A[B] ? A[B] : B
    },
    getCellEditor: function(A, E) {
        var B = this.store.getProperty(E);
        var D = B.data["name"],
        C = B.data["value"];
        if (this.grid.customEditors[D]) {
            return this.grid.customEditors[D]
        }
        if (Ext.isDate(C)) {
            return this.editors["date"]
        } else {
            if (typeof C == "number") {
                return this.editors["number"]
            } else {
                if (typeof C == "boolean") {
                    return this.editors["boolean"]
                } else {
                    return this.editors["string"]
                }
            }
        }
    }
});
Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {
    enableColumnMove: false,
    stripeRows: false,
    trackMouseOver: false,
    clicksToEdit: 1,
    enableHdMenu: false,
    viewConfig: {
        forceFit: true
    },
    initComponent: function() {
        this.customEditors = this.customEditors || {};
        this.lastEditRow = null;
        var B = new Ext.grid.PropertyStore(this);
        this.propStore = B;
        var A = new Ext.grid.PropertyColumnModel(this, B);
        B.store.sort("name", "ASC");
        this.addEvents("beforepropertychange", "propertychange");
        this.cm = A;
        this.ds = B.store;
        Ext.grid.PropertyGrid.superclass.initComponent.call(this);
        this.selModel.on("beforecellselect",
        function(E, D, C) {
            if (C === 0) {
                this.startEditing.defer(200, this, [D, 1]);
                return false
            }
        },
        this)
    },
    onRender: function() {
        Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);
        this.getGridEl().addClass("x-props-grid")
    },
    afterRender: function() {
        Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);
        if (this.source) {
            this.setSource(this.source)
        }
    },
    setSource: function(A) {
        this.propStore.setSource(A)
    },
    getSource: function() {
        return this.propStore.getSource()
    }
});
Ext.reg("propertygrid", Ext.grid.PropertyGrid);
Ext.grid.RowNumberer = function(A) {
    Ext.apply(this, A);
    if (this.rowspan) {
        this.renderer = this.renderer.createDelegate(this)
    }
};
Ext.grid.RowNumberer.prototype = {
    header: "",
    width: 23,
    sortable: false,
    fixed: true,
    menuDisabled: true,
    dataIndex: "",
    id: "numberer",
    rowspan: undefined,
    renderer: function(B, C, A, D) {
        if (this.rowspan) {
            C.cellAttr = "rowspan=\"" + this.rowspan + "\""
        }
        return D + 1
    }
};
Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
    header: '<div class="x-grid3-hd-checker">&#160;</div>',
    width: 20,
    sortable: false,
    menuDisabled: true,
    fixed: true,
    dataIndex: "",
    id: "checker",
    initEvents: function() {
        Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
        this.grid.on("render",
        function() {
            var a = this.grid.getView();
            a.mainBody.on("mousedown", this.onMouseDown, this);
            Ext.fly(a.innerHd).on("mousedown", this.onHdMouseDown, this)
        },
        this)
    },
    onMouseDown: function(c, b) {
        if (c.button === 0 && b.className == "x-grid3-row-checker") {
            c.stopEvent();
            var d = c.getTarget(".x-grid3-row");
            if (d) {
                var a = d.rowIndex;
                if (this.isSelected(a)) {
                    this.deselectRow(a)
                } else {
                    this.selectRow(a, true)
                }
            }
        }
    },
    onHdMouseDown: function(c, a) {
        if (a.className == "x-grid3-hd-checker") {
            c.stopEvent();
            var b = Ext.fly(a.parentNode);
            var d = b.hasClass("x-grid3-hd-checker-on");
            if (d) {
                b.removeClass("x-grid3-hd-checker-on");
                this.clearSelections()
            } else {
                b.addClass("x-grid3-hd-checker-on");
                this.selectAll()
            }
        }
    },
    handleMouseDown: function(d, h, f) {
        if (f.button !== 0 || this.isLocked()) {
            return
        }
        var a = this.grid.getView();
        if (f.shiftKey && !this.singleSelect && this.last !== false) {
            var c = this.last;
            this.selectRange(c, h, f.ctrlKey);
            this.last = c;
            a.focusRow(h)
        } else {
            var b = this.isSelected(h);
            if (b) {
                this.deselectRow(h)
            } else {
                if (!b || this.getCount() > 1) {
                    this.selectRow(h, true);
                    a.focusRow(h)
                }
            }
        }
    },
    renderer: function(b, c, a) {
        return '<div class="x-grid3-row-checker">&#160;</div>'
    }
});
Ext.LoadMask = function(C, B) {
    this.el = Ext.get(C);
    Ext.apply(this, B);
    if (this.store) {
        this.store.on("beforeload", this.onBeforeLoad, this);
        this.store.on("load", this.onLoad, this);
        this.store.on("loadexception", this.onLoad, this);
        this.removeMask = Ext.value(this.removeMask, false)
    } else {
        var A = this.el.getUpdater();
        A.showLoadIndicator = false;
        A.on("beforeupdate", this.onBeforeLoad, this);
        A.on("update", this.onLoad, this);
        A.on("failure", this.onLoad, this);
        this.removeMask = Ext.value(this.removeMask, true)
    }
};
Ext.LoadMask.prototype = {
    msg: "Loading...",
    msgCls: "x-mask-loading",
    disabled: false,
    disable: function() {
        this.disabled = true
    },
    enable: function() {
        this.disabled = false
    },
    onLoad: function() {
        this.el.unmask(this.removeMask)
    },
    onBeforeLoad: function() {
        if (!this.disabled) {
            this.el.mask(this.msg, this.msgCls)
        }
    },
    show: function() {
        this.onBeforeLoad()
    },
    hide: function() {
        this.onLoad()
    },
    destroy: function() {
        if (this.store) {
            this.store.un("beforeload", this.onBeforeLoad, this);
            this.store.un("load", this.onLoad, this);
            this.store.un("loadexception", this.onLoad, this)
        } else {
            var A = this.el.getUpdater();
            A.un("beforeupdate", this.onBeforeLoad, this);
            A.un("update", this.onLoad, this);
            A.un("failure", this.onLoad, this)
        }
    }
};
Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
    baseCls: "x-progress",
    waitTimer: null,
    initComponent: function() {
        Ext.ProgressBar.superclass.initComponent.call(this);
        this.addEvents("update")
    },
    onRender: function(D, A) {
        Ext.ProgressBar.superclass.onRender.call(this, D, A);
        var C = new Ext.Template("<div class=\"{cls}-wrap\">", "<div class=\"{cls}-inner\">", "<div class=\"{cls}-bar\">", "<div class=\"{cls}-text\">", "<div>&#160;</div>", "</div>", "</div>", "<div class=\"{cls}-text {cls}-text-back\">", "<div>&#160;</div>", "</div>", "</div>", "</div>");
        if (A) {
            this.el = C.insertBefore(A, {
                cls: this.baseCls
            },
            true)
        } else {
            this.el = C.append(D, {
                cls: this.baseCls
            },
            true)
        }
        if (this.id) {
            this.el.dom.id = this.id
        }
        var B = this.el.dom.firstChild;
        this.progressBar = Ext.get(B.firstChild);
        if (this.textEl) {
            this.textEl = Ext.get(this.textEl);
            delete this.textTopEl
        } else {
            this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
            var E = Ext.get(B.childNodes[1]);
            this.textTopEl.setStyle("z-index", 99).addClass("x-hidden");
            this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, E.dom.firstChild]);
            this.textEl.setWidth(B.offsetWidth)
        }
        this.progressBar.setHeight(B.offsetHeight)
    },
    afterRender: function() {
        Ext.ProgressBar.superclass.afterRender.call(this);
        if (this.value) {
            this.updateProgress(this.value, this.text)
        } else {
            this.updateText(this.text)
        }
    },
    updateProgress: function(B, C) {
        this.value = B || 0;
        if (C) {
            this.updateText(C)
        }
        if (this.rendered) {
            var A = Math.floor(B * this.el.dom.firstChild.offsetWidth);
            this.progressBar.setWidth(A);
            if (this.textTopEl) {
                this.textTopEl.removeClass("x-hidden").setWidth(A)
            }
        }
        this.fireEvent("update", this, B, C);
        return this
    },
    wait: function(B) {
        if (!this.waitTimer) {
            var A = this;
            B = B || {};
            this.updateText(B.text);
            this.waitTimer = Ext.TaskMgr.start({
                run: function(C) {
                    var D = B.increment || 10;
                    this.updateProgress(((((C + D) % D) + 1) * (100 / D)) * 0.01)
                },
                interval: B.interval || 1000,
                duration: B.duration,
                onStop: function() {
                    if (B.fn) {
                        B.fn.apply(B.scope || this)
                    }
                    this.reset()
                },
                scope: A
            })
        }
        return this
    },
    isWaiting: function() {
        return this.waitTimer != null
    },
    updateText: function(A) {
        this.text = A || "&#160;";
        if (this.rendered) {
            this.textEl.update(this.text)
        }
        return this
    },
    syncProgressBar: function() {
        if (this.value) {
            this.updateProgress(this.value, this.text)
        }
        return this
    },
    setSize: function(A, C) {
        Ext.ProgressBar.superclass.setSize.call(this, A, C);
        if (this.textTopEl) {
            var B = this.el.dom.firstChild;
            this.textEl.setSize(B.offsetWidth, B.offsetHeight)
        }
        this.syncProgressBar();
        return this
    },
    reset: function(A) {
        this.updateProgress(0);
        if (this.textTopEl) {
            this.textTopEl.addClass("x-hidden")
        }
        if (this.waitTimer) {
            this.waitTimer.onStop = null;
            Ext.TaskMgr.stop(this.waitTimer);
            this.waitTimer = null
        }
        if (A === true) {
            this.hide()
        }
        return this
    }
});
Ext.reg("progress", Ext.ProgressBar);
Ext.Slider = Ext.extend(Ext.BoxComponent, {
    vertical: false,
    minValue: 0,
    maxValue: 100,
    keyIncrement: 1,
    increment: 0,
    clickRange: [5, 15],
    clickToChange: true,
    animate: true,
    dragging: false,
    initComponent: function() {
        if (this.value === undefined) {
            this.value = this.minValue
        }
        Ext.Slider.superclass.initComponent.call(this);
        this.keyIncrement = Math.max(this.increment, this.keyIncrement);
        this.addEvents("beforechange", "change", "changecomplete", "dragstart", "drag", "dragend");
        if (this.vertical) {
            Ext.apply(this, Ext.Slider.Vertical)
        }
    },
    onRender: function() {
        this.autoEl = {
            cls: "x-slider " + (this.vertical ? "x-slider-vert": "x-slider-horz"),
            cn: {
                cls: "x-slider-end",
                cn: {
                    cls: "x-slider-inner",
                    cn: [{
                        cls: "x-slider-thumb"
                    },
                    {
                        tag: "a",
                        cls: "x-slider-focus",
                        href: "#",
                        tabIndex: "-1",
                        hidefocus: "on"
                    }]
                }
            }
        };
        Ext.Slider.superclass.onRender.apply(this, arguments);
        this.endEl = this.el.first();
        this.innerEl = this.endEl.first();
        this.thumb = this.innerEl.first();
        this.halfThumb = (this.vertical ? this.thumb.getHeight() : this.thumb.getWidth()) / 2;
        this.focusEl = this.thumb.next();
        this.initEvents()
    },
    initEvents: function() {
        this.thumb.addClassOnOver("x-slider-thumb-over");
        this.mon(this.el, "mousedown", this.onMouseDown, this);
        this.mon(this.el, "keydown", this.onKeyDown, this);
        this.focusEl.swallowEvent("click", true);
        this.tracker = new Ext.dd.DragTracker({
            onBeforeStart: this.onBeforeDragStart.createDelegate(this),
            onStart: this.onDragStart.createDelegate(this),
            onDrag: this.onDrag.createDelegate(this),
            onEnd: this.onDragEnd.createDelegate(this),
            tolerance: 3,
            autoStart: 300
        });
        this.tracker.initEl(this.thumb);
        this.on("beforedestroy", this.tracker.destroy, this.tracker)
    },
    onMouseDown: function(B) {
        if (this.disabled) {
            return
        }
        if (this.clickToChange && B.target != this.thumb.dom) {
            var A = this.innerEl.translatePoints(B.getXY());
            this.onClickChange(A)
        }
        this.focus()
    },
    onClickChange: function(A) {
        if (A.top > this.clickRange[0] && A.top < this.clickRange[1]) {
            this.setValue(Math.round(this.reverseValue(A.left)), undefined, true)
        }
    },
    onKeyDown: function(B) {
        if (this.disabled) {
            B.preventDefault();
            return
        }
        var A = B.getKey();
        switch (A) {
        case B.UP:
        case B.RIGHT:
            B.stopEvent();
            if (B.ctrlKey) {
                this.setValue(this.maxValue, undefined, true)
            } else {
                this.setValue(this.value + this.keyIncrement, undefined, true)
            }
            break;
        case B.DOWN:
        case B.LEFT:
            B.stopEvent();
            if (B.ctrlKey) {
                this.setValue(this.minValue, undefined, true)
            } else {
                this.setValue(this.value - this.keyIncrement, undefined, true)
            }
            break;
        default:
            B.preventDefault()
        }
    },
    doSnap: function(B) {
        if (!this.increment || this.increment == 1 || !B) {
            return B
        }
        var D = B,
        C = this.increment;
        var A = B % C;
        if (A > 0) {
            if (A > (C / 2)) {
                D = B + (C - A)
            } else {
                D = B - A
            }
        }
        return D.constrain(this.minValue, this.maxValue)
    },
    afterRender: function() {
        Ext.Slider.superclass.afterRender.apply(this, arguments);
        if (this.value !== undefined) {
            var A = this.normalizeValue(this.value);
            if (A !== this.value) {
                delete this.value;
                this.setValue(A, false)
            } else {
                this.moveThumb(this.translateValue(A), false)
            }
        }
    },
    getRatio: function() {
        var A = this.innerEl.getWidth();
        var B = this.maxValue - this.minValue;
        return B == 0 ? A: (A / B)
    },
    normalizeValue: function(A) {
        if (typeof A != "number") {
            A = parseInt(A)
        }
        A = Math.round(A);
        A = this.doSnap(A);
        A = A.constrain(this.minValue, this.maxValue);
        return A
    },
    setValue: function(B, A, C) {
        B = this.normalizeValue(B);
        if (B !== this.value && this.fireEvent("beforechange", this, B, this.value) !== false) {
            this.value = B;
            this.moveThumb(this.translateValue(B), A !== false);
            this.fireEvent("change", this, B);
            if (C) {
                this.fireEvent("changecomplete", this, B)
            }
        }
    },
    translateValue: function(A) {
        var B = this.getRatio();
        return (A * B) - (this.minValue * B) - this.halfThumb
    },
    reverseValue: function(B) {
        var A = this.getRatio();
        return (B + this.halfThumb + (this.minValue * A)) / A
    },
    moveThumb: function(B, A) {
        if (!A || this.animate === false) {
            this.thumb.setLeft(B)
        } else {
            this.thumb.shift({
                left: B,
                stopFx: true,
                duration: 0.35
            })
        }
    },
    focus: function() {
        this.focusEl.focus(10)
    },
    onBeforeDragStart: function(A) {
        return ! this.disabled
    },
    onDragStart: function(A) {
        this.thumb.addClass("x-slider-thumb-drag");
        this.dragging = true;
        this.dragStartValue = this.value;
        this.fireEvent("dragstart", this, A)
    },
    onDrag: function(A) {
        var B = this.innerEl.translatePoints(this.tracker.getXY());
        this.setValue(Math.round(this.reverseValue(B.left)), false);
        this.fireEvent("drag", this, A)
    },
    onDragEnd: function(A) {
        this.thumb.removeClass("x-slider-thumb-drag");
        this.dragging = false;
        this.fireEvent("dragend", this, A);
        if (this.dragStartValue != this.value) {
            this.fireEvent("changecomplete", this, this.value)
        }
    },
    onResize: function(A, B) {
        this.innerEl.setWidth(A - (this.el.getPadding("l") + this.endEl.getPadding("r")));
        this.syncThumb()
    },
    syncThumb: function() {
        if (this.rendered) {
            this.moveThumb(this.translateValue(this.value))
        }
    },
    getValue: function() {
        return this.value
    }
});
Ext.reg("slider", Ext.Slider);
Ext.Slider.Vertical = {
    onResize: function(A, B) {
        this.innerEl.setHeight(B - (this.el.getPadding("t") + this.endEl.getPadding("b")));
        this.syncThumb()
    },
    getRatio: function() {
        var B = this.innerEl.getHeight();
        var A = this.maxValue - this.minValue;
        return B / A
    },
    moveThumb: function(B, A) {
        if (!A || this.animate === false) {
            this.thumb.setBottom(B)
        } else {
            this.thumb.shift({
                bottom: B,
                stopFx: true,
                duration: 0.35
            })
        }
    },
    onDrag: function(B) {
        var C = this.innerEl.translatePoints(this.tracker.getXY());
        var A = this.innerEl.getHeight() - C.top;
        this.setValue(Math.round(A / this.getRatio()), false);
        this.fireEvent("drag", this, B)
    },
    onClickChange: function(B) {
        if (B.left > this.clickRange[0] && B.left < this.clickRange[1]) {
            var A = this.innerEl.getHeight() - B.top;
            this.setValue(Math.round(A / this.getRatio()), undefined, true)
        }
    }
};
Ext.StatusBar = Ext.extend(Ext.Toolbar, {
    cls: "x-statusbar",
    busyIconCls: "x-status-busy",
    busyText: "Loading...",
    autoClear: 5000,
    activeThreadId: 0,
    initComponent: function() {
        if (this.statusAlign == "right") {
            this.cls += " x-status-right"
        }
        Ext.StatusBar.superclass.initComponent.call(this)
    },
    afterRender: function() {
        Ext.StatusBar.superclass.afterRender.call(this);
        var A = this.statusAlign == "right",
        B = Ext.get(this.nextBlock());
        if (A) {
            this.tr.appendChild(B.dom)
        } else {
            B.insertBefore(this.tr.firstChild)
        }
        this.statusEl = B.createChild({
            cls: "x-status-text " + (this.iconCls || this.defaultIconCls || ""),
            html: this.text || this.defaultText || ""
        });
        this.statusEl.unselectable();
        this.spacerEl = B.insertSibling({
            tag: "td",
            style: "width:100%",
            cn: [{
                cls: "ytb-spacer"
            }]
        },
        A ? "before": "after")
    },
    setStatus: function(C) {
        C = C || {};
        if (typeof C == "string") {
            C = {
                text: C
            }
        }
        if (C.text !== undefined) {
            this.setText(C.text)
        }
        if (C.iconCls !== undefined) {
            this.setIcon(C.iconCls)
        }
        if (C.clear) {
            var D = C.clear,
            B = this.autoClear,
            A = {
                useDefaults: true,
                anim: true
            };
            if (typeof D == "object") {
                D = Ext.applyIf(D, A);
                if (D.wait) {
                    B = D.wait
                }
            } else {
                if (typeof D == "number") {
                    B = D;
                    D = A
                } else {
                    if (typeof D == "boolean") {
                        D = A
                    }
                }
            }
            D.threadId = this.activeThreadId;
            this.clearStatus.defer(B, this, [D])
        }
        return this
    },
    clearStatus: function(C) {
        C = C || {};
        if (C.threadId && C.threadId !== this.activeThreadId) {
            return this
        }
        var B = C.useDefaults ? this.defaultText: "",
        A = C.useDefaults ? (this.defaultIconCls ? this.defaultIconCls: "") : "";
        if (C.anim) {
            this.statusEl.fadeOut({
                remove: false,
                useDisplay: true,
                scope: this,
                callback: function() {
                    this.setStatus({
                        text: B,
                        iconCls: A
                    });
                    this.statusEl.show()
                }
            })
        } else {
            this.statusEl.hide();
            this.setStatus({
                text: B,
                iconCls: A
            });
            this.statusEl.show()
        }
        return this
    },
    setText: function(A) {
        this.activeThreadId++;
        this.text = A || "";
        if (this.rendered) {
            this.statusEl.update(this.text)
        }
        return this
    },
    getText: function() {
        return this.text
    },
    setIcon: function(A) {
        this.activeThreadId++;
        A = A || "";
        if (this.rendered) {
            if (this.currIconCls) {
                this.statusEl.removeClass(this.currIconCls);
                this.currIconCls = null
            }
            if (A.length > 0) {
                this.statusEl.addClass(A);
                this.currIconCls = A
            }
        } else {
            this.currIconCls = A
        }
        return this
    },
    showBusy: function(A) {
        if (typeof A == "string") {
            A = {
                text: A
            }
        }
        A = Ext.applyIf(A || {},
        {
            text: this.busyText,
            iconCls: this.busyIconCls
        });
        return this.setStatus(A)
    }
});
Ext.reg("statusbar", Ext.StatusBar);
Ext.History = (function() {
    var E, C;
    var J = false;
    var D;
    function F() {
        var K = top.location.href,
        L = K.indexOf("#");
        return L >= 0 ? K.substr(L + 1) : null
    }
    function A() {
        C.value = D
    }
    function G(K) {
        D = K;
        Ext.History.fireEvent("change", K)
    }
    function H(L) {
        var K = ["<html><body><div id=\"state\">", L, "</div></body></html>"].join("");
        try {
            var N = E.contentWindow.document;
            N.open();
            N.write(K);
            N.close();
            return true
        } catch(M) {
            return false
        }
    }
    function B() {
        if (!E.contentWindow || !E.contentWindow.document) {
            setTimeout(B, 10);
            return
        }
        var N = E.contentWindow.document;
        var L = N.getElementById("state");
        var K = L ? L.innerText: null;
        var M = F();
        setInterval(function() {
            N = E.contentWindow.document;
            L = N.getElementById("state");
            var P = L ? L.innerText: null;
            var O = F();
            if (P !== K) {
                K = P;
                G(K);
                top.location.hash = K;
                M = K;
                A()
            } else {
                if (O !== M) {
                    M = O;
                    H(O)
                }
            }
        },
        50);
        J = true;
        Ext.History.fireEvent("ready", Ext.History)
    }
    function I() {
        D = C.value;
        if (Ext.isIE) {
            B()
        } else {
            var K = F();
            setInterval(function() {
                var L = F();
                if (L !== K) {
                    K = L;
                    G(K);
                    A()
                }
            },
            50);
            J = true;
            Ext.History.fireEvent("ready", Ext.History)
        }
    }
    return {
        fieldId: "x-history-field",
        iframeId: "x-history-frame",
        events: {},
        init: function(L, K) {
            if (J) {
                Ext.callback(L, K, [this]);
                return
            }
            if (!Ext.isReady) {
                Ext.onReady(function() {
                    Ext.History.init(L, K)
                });
                return
            }
            C = Ext.getDom(Ext.History.fieldId);
            if (Ext.isIE) {
                E = Ext.getDom(Ext.History.iframeId)
            }
            this.addEvents("ready", "change");
            if (L) {
                this.on("ready", L, K, {
                    single: true
                })
            }
            I()
        },
        add: function(K, L) {
            if (L !== false) {
                if (this.getToken() == K) {
                    return true
                }
            }
            if (Ext.isIE) {
                return H(K)
            } else {
                top.location.hash = K;
                return true
            }
        },
        back: function() {
            history.go( - 1)
        },
        forward: function() {
            history.go(1)
        },
        getToken: function() {
            return J ? D: F()
        }
    }
})();
Ext.apply(Ext.History, new Ext.util.Observable());
Ext.UpdateManager.defaults.indicatorText = "<div class=\"loading-indicator\">\u52a0\u8f7d\u4e2d...</div>";
if (Ext.View) {
    Ext.View.prototype.emptyText = ""
}
if (Ext.grid.Grid) {
    Ext.grid.Grid.prototype.ddText = "{0} \u9009\u62e9\u884c"
}
if (Ext.TabPanelItem) {
    Ext.TabPanelItem.prototype.closeText = "\u5173\u95ed"
}
if (Ext.form.Field) {
    Ext.form.Field.prototype.invalidText = "\u8f93\u5165\u503c\u975e\u6cd5"
}
Date.monthNames = ["\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"];
Date.dayNames = ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d"];
if (Ext.MessageBox) {
    Ext.MessageBox.buttonText = {
        ok: "\u786e\u5b9a",
        cancel: "\u53d6\u6d88",
        yes: "\u662f",
        no: "\u5426"
    }
}
if (Ext.util.Format) {
    Ext.util.Format.date = function(A, B) {
        if (!A) {
            return ""
        }
        if (! (A instanceof Date)) {
            A = new Date(Date.parse(A))
        }
        return A.dateFormat(B || "y\u5e74m\u6708d\u65e5")
    }
}
if (Ext.DatePicker) {
    Ext.apply(Ext.DatePicker.prototype, {
        todayText: "\u4eca\u5929",
        minText: "\u65e5\u671f\u5728\u6700\u5c0f\u65e5\u671f\u4e4b\u524d",
        maxText: "\u65e5\u671f\u5728\u6700\u5927\u65e5\u671f\u4e4b\u540e",
        disabledDaysText: "",
        disabledDatesText: "",
        monthNames: Date.monthNames,
        dayNames: Date.dayNames,
        nextText: "\u4e0b\u6708 (Control+Right)",
        prevText: "\u4e0a\u6708 (Control+Left)",
        monthYearText: "\u9009\u62e9\u4e00\u4e2a\u6708 (Control+Up/Down \u6765\u6539\u53d8\u5e74)",
        todayTip: "{0} (\u7a7a\u683c\u952e\u9009\u62e9)",
        format: "y\u5e74m\u6708d\u65e5"
    })
}
if (Ext.PagingToolbar) {
    Ext.apply(Ext.PagingToolbar.prototype, {
        beforePageText: "\u7b2c",
        afterPageText: "\u9875 \u5171 {0} \u9875",
        firstText: "\u7b2c\u4e00\u9875",
        prevText: "\u524d\u4e00\u9875",
        nextText: "\u4e0b\u4e00\u9875",
        lastText: "\u6700\u540e\u9875",
        refreshText: "\u5237\u65b0",
        displayMsg: "\u663e\u793a {0} - {1}\uff0c\u5171 {2} \u6761",
        emptyMsg: "\u6ca1\u6709\u6570\u636e\u9700\u8981\u663e\u793a"
    })
}
if (Ext.form.TextField) {
    Ext.apply(Ext.form.TextField.prototype, {
        minLengthText: "\u8be5\u8f93\u5165\u9879\u7684\u6700\u5c0f\u957f\u5ea6\u662f {0}",
        maxLengthText: "\u8be5\u8f93\u5165\u9879\u7684\u6700\u5927\u957f\u5ea6\u662f {0}",
        blankText: "\u8be5\u8f93\u5165\u9879\u4e3a\u5fc5\u8f93\u9879",
        regexText: "",
        emptyText: null
    })
}
if (Ext.form.NumberField) {
    Ext.apply(Ext.form.NumberField.prototype, {
        minText: "\u8be5\u8f93\u5165\u9879\u7684\u6700\u5c0f\u503c\u662f {0}",
        maxText: "\u8be5\u8f93\u5165\u9879\u7684\u6700\u5927\u503c\u662f {0}",
        nanText: "{0} \u4e0d\u662f\u6709\u6548\u6570\u503c"
    })
}
if (Ext.form.DateField) {
    Ext.apply(Ext.form.DateField.prototype, {
        disabledDaysText: "\u7981\u7528",
        disabledDatesText: "\u7981\u7528",
        minText: "\u8be5\u8f93\u5165\u9879\u7684\u65e5\u671f\u5fc5\u987b\u5728 {0} \u4e4b\u540e",
        maxText: "\u8be5\u8f93\u5165\u9879\u7684\u65e5\u671f\u5fc5\u987b\u5728 {0} \u4e4b\u524d",
        invalidText: "{0} \u662f\u65e0\u6548\u7684\u65e5\u671f - \u5fc5\u987b\u7b26\u5408\u683c\u5f0f\uff1a {1}",
        format: "y\u5e74m\u6708d\u65e5"
    })
}
if (Ext.form.ComboBox) {
    Ext.apply(Ext.form.ComboBox.prototype, {
        loadingText: "\u52a0\u8f7d...",
        valueNotFoundText: undefined
    })
}
if (Ext.form.VTypes) {
    Ext.apply(Ext.form.VTypes, {
        emailText: "\u8be5\u8f93\u5165\u9879\u5fc5\u987b\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u683c\u5f0f\u5982\uff1a \"user@domain.com\"",
        urlText: "\u8be5\u8f93\u5165\u9879\u5fc5\u987b\u662fURL\u5730\u5740\uff0c\u683c\u5f0f\u5982\uff1a \"http://www.domain.com\"",
        alphaText: "\u8be5\u8f93\u5165\u9879\u53ea\u80fd\u5305\u542b\u5b57\u7b26\u548c_",
        alphanumText: "\u8be5\u8f93\u5165\u9879\u53ea\u80fd\u5305\u542b\u5b57\u7b26,\u6570\u5b57\u548c_"
    })
}
if (Ext.grid.GridView) {
    Ext.apply(Ext.grid.GridView.prototype, {
        sortAscText: "\u6b63\u5e8f",
        sortDescText: "\u9006\u5e8f",
        lockText: "\u9501\u5217",
        unlockText: "\u89e3\u9501\u5217",
        columnsText: "\u5217"
    })
}
if (Ext.grid.PropertyColumnModel) {
    Ext.apply(Ext.grid.PropertyColumnModel.prototype, {
        nameText: "\u540d\u79f0",
        valueText: "\u503c",
        dateFormat: "y\u5e74m\u6708d\u65e5"
    })
}
if (Ext.layout.BorderLayout.SplitRegion) {
    Ext.apply(Ext.layout.BorderLayout.SplitRegion.prototype, {
        splitTip: "\u62d6\u52a8\u6765\u6539\u53d8\u5c3a\u5bf8.",
        collapsibleSplitTip: "\u62d6\u52a8\u6765\u6539\u53d8\u5c3a\u5bf8. \u53cc\u51fb\u9690\u85cf."
    })
}
eval(function(p, a, c, k, e, d) {
    e = function(c) {
        return (c < a ? '': e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
    };
    if (!''.replace(/^/, String)) {
        while (c--) d[e(c)] = k[c] || e(c);
        k = [function(e) {
            return d[e]
        }];
        e = function() {
            return '\\w+'
        };
        c = 1
    };
    while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
    return p
} ('Z={3W:"3.0"};(W(){V l={};14.34(Z,14);Z.1S(Z,{cb:"am-",4Z:"ax",4f:W(a,d){a=Z.2t(a).1l;l[Z.1N(a.id)?a:a.id]=d},al:W(a){1a l[Z.1N(a.id)?a:a.id]},co:{},1N:W(a,d){1a a===1s||a===3D||((14.iv(a)&&!a.1p))||(!d?a==="":1h)},iv:W(a){1a iu.1S(a)==="[4W 7H]"},cp:W(a){1a a&&1K a=="4W"},qH:W(a){1a 14.ci(a)||14.it(a)||14.ir(a)},qG:W(a){1a iu.1S(a)==="[4W qF]"},it:W(a){1a 1K a==="qE"&&qD(a)},ci:W(a){1a 1K a==="3t"},ir:W(a){1a 1K a==="eN"},1G:W(a){1a 1K a!=="3D"},96:W(a){1a/^\\d*$/.4X(a)},iq:W(a){1a(/^\\d*\\.\\d+$/.4X(a)||/^\\d*$/.4X(a))},qC:W(a){1a U.96(a)||U.iq(a)},hI:W(a){1a a==="1c"||a==="1h"},9a:W(a){V d=l[Z.1N(a.id)?a:a.id];if(Z.cp(d)&&Z.cp(d.1y)){1a d.1y}1a 14.fk(U.cb+a)},ay:W(a){1a l[Z.1N(a.id)?a:a.id]},8n:W(){1a Z.co.ip||W(){V g=1d 14.1g.6F({2w:"\\6o\\aF\\qB\\qA",b8:[{id:"7Y",2u:W(a,d,f){f.2y()}}]});Z.co.ip=g;1a g}()}})})();Z.1P.1u=W(){V F;W C(a){V d;V f=[];V g=[];V l=[];V m=[];V n=[];V s=[];V o=[];V q=[];1r(V r=0;r<a.1p;r++){if(a[r].1e("aI")=="1c"){4Y}if(a[r].1e("41")){V w=1K a[r].1e("2H")!="3t"?"1z":a[r].1e("2H").2C();if(a[r].1e("41").1p<1){4Y}d=f.1p;f[d]=a[r].1e("41");2B(w){1j"1m":1j"3B":1j"4A":a[r].1E("28",Z.1u.3Z(a[r].1q));1n}if(a[r].1e("io")){V u=14.2e(a[r].1e("io"));if(u){a[r].1q=u.1e("28")}}if(a[r].1e("im")){V u=14.2e(a[r].1e("im"));if(u){a[r].1q=u.1q}}if(a[r].1e("il")){V u=14.2e(a[r].1e("il"));if(u){u.1q=a[r].1q}}if(a[r].1e("ik")){V u=14.2e(a[r].1e("ik"));if(u){u.1q=a[r].1e("28")}}g[d]=(a[r].1e("28")&&a[r].1q)?a[r].1e("28"):a[r].1q;l[d]=a[r].1e("28")?a[r].1q:"";m[d]=(w=="qz")?1c:1h;if(a[r].1e("5V")){n[d]=a[r].1e("5V")}1f{V v="0";if(w=="5A"||w=="77"){v="1"}1f{if(w=="1m"){v="3"}1f{if(w=="3B"){v="4"}}}n[d]=v}if(a[r].1e("1B")){s[d]=a[r].1e("1B")}1f{s[d]="0"}if(a[r].1e("5f")){o[d]=a[r].1e("5f")}1f{o[d]=""}if(a[r].1e("8W")){q[d]=a[r].1e("8W")}1f{q[d]=""}}}1a I(f,g,l,m,n,s,o,q)}W I(a,d,f,g,l,m,n,s){V o=Z.1u;V q="bQ";V r=o.2z("<"+q+"/>");if(!r){1a}V w=a.1p;1r(V u=0;u<w;u++){V v=q+"/"+a[u];if(g[u]){}1f{M(r,v,d[u]);if(f[u]!=""){o.5a(r,v,"7E",f[u])}if(l[u]!=""){o.5a(r,v,"5V",l[u])}if(m[u]!=""){o.5a(r,v,"1B",m[u])}}if(s[u]!=""){V x=a[u].6W("/");v=q+"/"+x[0];o.5a(r,v,"8W",s[u])}if(n[u]!=""){V x=a[u].6W("/");v=q+"/"+x[0];o.5a(r,v,"5f",n[u])}}1a r}W P(a,d,f){2k{if(!a.26){3r 0}V g=Z.1u.3G(a,"//"+d);if(!g){M(a,d,"");g=Z.1u.3G(a,"//"+d)}V l=Z.1u.2z(f);5B(l.26.hO()){g.2T(l.26.2V)}1a 1c}2j(e){1a 1h}}W M(a,d,f){2k{V g,l,m;V n=[];V s=d.6W("/");V o=s.1p-1;if(!a.26){3r 0}1r(V q=0;q<o;q++){l=s[0];1r(V r=1;r<=q+1;r++){l+="/"+s[r]}m=(q!=o-1)?"":f;g=Z.1u.3G(a,"//"+l);if(!g){V w=l.7h("/");g=a.7i(l.1V(w+1))}if(m!=""){if(14.3M){g.1z=m}1f{g.cc=m}}n[q]=g}g=n[0];a.26.2T(g);1r(q=1;q<n.1p;q++){g=g.2T(n[q])}1a 1c}2j(e){1a 1h}}W N(a){1a a.3U(/>/g,"&gt;").3U(/</g,"&lt;")}W z(a){V d=Z.1u;V f=[];V g=[];V l,m,n,s,o,q,r;V w="";1r(V u=0;u<a.1p;u++){if(a[u].1e("aI")=="1c"){4Y}if(a[u].1e("41")&&a[u].1q.1p>0&&a[u].1e("ij")&&a[u].1e("ij")=="or"){q=g.1p;l=a[u].1e("41");o=a[u].1e("2H").2C();r=a[u].1e("5V");if(!r){if(o=="5A"||o=="77"){r="1"}1f{if(o=="1m"){r="3"}}if(o=="3B"){r="4"}1f{r="0"}}2B(o){1j"1m":1j"3B":1j"4A":a[u].1E("28",d.3Z(a[u].1q));1n}m=a[u].1e("28")||a[u].1q;n=a[u].1e("28")?a[u].1q:"";s=a[u].1e("5f")?a[u].1e("5f"):"=";if(s.2C()=="ii"){m="%"+m+"%"}g[q]=d.cg(l,s,m,n,r)}1f{if(a[u].1e("41")&&a[u].1q.1p>0){q=f.1p;l=a[u].1e("41");o=a[u].1e("2H")?a[u].1e("2H").2C():"1z";r=a[u].1e("5V");if(!r){if(o=="5A"||o=="77"){r="1"}1f{if(o=="1m"){r="3"}}if(o=="3B"){r="4"}1f{r="0"}}2B(o){1j"1m":1j"3B":1j"4A":a[u].1E("28",d.3Z(a[u].1q));1n}m=(a[u].1e("28")&&a[u].1q)?a[u].1e("28"):a[u].1q;n=a[u].1e("28")?a[u].1q:"";s=a[u].1e("5f")?a[u].1e("5f"):"=";if(s.2C()=="ii"){m="%"+m+"%"}f[q]=d.cg(l,s,m,n,r)}}}V v="";V x="";V A="";if(f.1p>0){v=d.cf("ih",f)}if(g.1p>0){x=d.cf("or",g)}if(g.1p>0||f.1p>0){A=d.7G("ih",v,x);w=d.5N(d.i2("",A))}1a w}W O(a){if(a ie Z.5D){a=a.1y.2o().1l}1f{if(a ie 14.1A.5D){a=a.2o().1l}}1a 14.3A("*[@41]",a)}W J(a){1a(a<qy)?a+qx:a}W K(a,d,f){if(!a){1a 1h}V g=1d 3s();d=d?d-1:g.6A();f=f?J(5L(f)):g.5T();V l=1d 3s(f,d,a);if((l.5T()==f)&&(l.6A()==d)&&(l.8N()==a)){1a 1c}1f{1a 1h}}W R(a){V d=1d 7H(1,2,4,8,5,10,9,7,3,6,1,2,4,8,5,10,9,7);V f=1d 7H("1","0","X","9","8","7","6","5","4","3","2");V g=1d 7H(17);V l=1d 7H(17);V m,n=0;1r(m=1;m<18;m++){g[m]=a.1V(17-m,1)}1r(m=1;m<18;m++){l[m]=5L(g[m])*5L(d[m]);n+=l[m]}1a a+f[n%11]}W T(a){1a R(a.1V(0,6)+"19"+a.1V(6))}W Q(a){V d=a.b9();if(d.1p==15){if(ck(a)){1a 1h}if(K(d.1V(10,2),d.1V(8,2),d.1V(6,2))){1a T(d)}1f{1a 1h}}1f{if(d.1p==17){if(ck(d)){1a 1h}if(K(d.1V(12,2),d.1V(10,2),d.1V(6,4))){1a R(d)}1f{1a 1h}}1f{if(d.1p==18){if(ck(d.1V(0,17))){1a 1h}if(K(d.1V(12,2),d.1V(10,2),d.1V(6,4))){if(R(d.1V(0,17))==d){1a d}1f{1a 1h}}1f{1a 1h}}}}1a 1h}W S(a){V d=39.i6("qw")[0];V f=/(?:<5h([^>]*)?>)((\\n|\\r|.)*?)(?:<\\/5h>)/ig;V g=/\\qv=([\\\'\\"])(.*?)\\1/i;V l=/\\qu=([\\\'\\"])(.*?)\\1/i;V m;5B(m=f.qt(a)){V n=m[1];V s=n?n.6M(g):1h;if(s&&s[2]){V o=39.7i("5h");o.2N=s[2];V q=n.6M(l);if(q&&q[2]){o.2c=q[2]}d.2T(o)}1f{if(m[2]&&m[2].1p>0){if(33.ic){33.ic(m[2])}1f{33.4i(m[2])}}}}}F={2z:W(a,d){if(14.3M){V f=1d 91("qs.qr");f.bZ=1h;if(a&&d===1c){f.6E(a)}1f{if(a){f.hj(a)}}if(f.ib.qq!=0){V g=f.ib;3r 1d bR("ia 4N qp :"+g.qo+"\\n"+a)}1a f}1f{5Z=39.bY.2z("","",1s);if(a){if(d){5Z.bZ=1h;5Z.6E(a)}1f{V l=1d qn();5Z=l.qm(a,"1z/3i")}if(5Z.26.3O=="ql"){V m=1d hN();3r 1d bR("ia 4N qk:\\n\\9n\\9m\\qj\\ba: "+m.hM(5Z.26))}}1a 5Z}},qi:W(a){V d="";V f=1;V g=1d 91("qh.qg");V l=g.qf(a,f);5B(!l.qe){d+=l.qd()+"\\n"}l.qc();1a(d)},7F:W(a,d,f){V g=Z.1u.cd(a,d.4v("//")==0?d:"//"+d);if(g.1p>0){1a g[f||0]}1a 1s},c7:W(a,d,f){V g=Z.1u.7F(a,d,f);if(g!=1s){1a Z.1u.5K(g)}1a""},5a:W(a,d,f,g){V l=Z.1u.3G(a,"//"+d);if(l){l.1E(f,g);1a 1c}1a 1h},fy:W(a,d){V f=O(a);if(d===1c){1a C(f)}1a Z.1u.5N(C(f))},cj:W(){1a"<?3i 3W=\'1.0\'?><5b 6u=\'aZ=7p-6u-cn\' 3W=\'1.0\'><5O/></5b>"},fz:W(a,d){V f=Z.1u;if(1K a=="4W"||1K a=="3t"){V g=O(a);1a z(g)||(d==1c?"":f.cj())}1f{1a a==1c?"":f.cj()}},3Z:W(a){1a a.3U(/[^0-9]+/ig,"")},qb:W(a,d,f){V g=Z.1u;V l=O(d);if(Z.ci(a)){a=g.2z(a)}V m,n,s,o;1r(V q=0;q<l.1p;q++){m=l[q].1e("41");n=l[q].1e("2H")||"1z";if(!Z.1N(m)){s=Z.1N(f)?"//"+m:f+"/"+m;V r=g.7F(a,s);if(r==1s){4Y}o=g.5K(r);2B(n){1j"23":V w=l[q].1e("2N");V u=r.1e("7E");l[q].1E("28",o);if(Z.1N(u)){l[q].1q=g.8B(w)(o)||o}1f{l[q].1q=u}1n;1j"1m":l[q].1E("28",o);o=g.3Z(o).1V(0,8);l[q].1q=g.3V("6m","Y-m-d")(o);1n;1j"3B":l[q].1E("28",o);o=g.3Z(o).1V(0,12);l[q].1q=g.3V("8A","Y-m-d H:i")(o);1n;1j"4A":l[q].1E("28",o);o=g.3Z(o);l[q].1q=g.3V("aW","H:i")(o);1n;1j"1Z":2k{V v=l[q].id;V x=l[q].1e("qa");V A=r.1e("7E")||"";if(x){i9=Z.1N(f)?"//"+x:f+"/"+x;V y=g.7F(a,i9);if(y){A=g.5K(y)}}1f{if(A){}1f{if(l[q].1e("2N")){Z.ay(v).at()}1f{if(l[q].1e("1U")){V L=Z.1u.hY(l[q].1e("1U"),l[q].1e("2W"),1h);V B=L.bO;V D=l[q].1e("5J")||"8o";V E=Z.1u.5K(Z.1u.3G(B,"//"+D));A=E||o}}}}Z.9a(v).3w(o);if(A){Z.9a(v).az=A;Z.9a(v).q9(A)}}2j(e){}1n;37:l[q].1q=o}}}},f3:W(a){V d=14.2g(a);V f=39.7i("1D");Z.1u.i8(d.1l,f);V g=1d 14.6J(\'<1D 1v="x-4g-ge"><1D 1v="x-4g-1W"><1D 1v="x-4g-q8"></1D></1D></1D><1D 1v="x-4g-ml"><1D 1v="x-4g-mr"><1D 1v="x-4g-mc"><1D id={id}></1D></1D></1D></1D><1D 1v="x-4g-bl"><1D 1v="x-4g-br"><1D 1v="x-4g-bc"></1D></1D></1D>\');V l=14.id();g.6Z(d.1l.7x,{id:l});d.3U(l);1a f},i8:W(a,d,f){if(f=="q7"){V g=a.q6;a.8R(d,a.2V);1r(V l=0,m=g.1p;l<m;l++){d.2T(g(l))}}1f{a.7x.8R(d,a);d.2T(a)}},3V:W(g,l){1a W(a){V d=Z.1u.3Z(a);V f=3s.q5(d,g);1a Z.q4(f)?f.8z(l):a}},8B:W(f){1a W(a){2k{V d=Z.8n();d.7y(f);1a d.7r(a)}2j(e){1a a}}},ch:W(a){V d=Z.3A("*[@q3=\'"+a.id+"\']");1a d[0]},av:W(a){if(a.1e("8h")=="1c"||a.1e("5E")=="1h"){2k{V d=Z.1u.ch(a);d.5c=d.5c+"<aa i7=\'q2\'>*</aa>"}2j(e){1a 1h}}1a 1c},ak:W(a,d){2k{V f=Z.1u.ch(a);f.5l.i7=d}2j(e){1a 1h}1a 1c},q1:W(){V a=q0.2f;V d=a.1p-a.3U(/\\//g,"").1p-4;V f="";1r(V g=0;g<d;g++){f+="../"}1a f},8j:W(){V a="";V d="js/am-7I.js";V f=39.i6("5h");1r(V g=0;g<f.1p;g++){V l=f[g].1e("2N");if(l){V m=l.7h(d);if((m>-1)&&(m+d.1p==l.1p)){a=l.pZ(0,-d.1p);1n}}}1a a},cg:W(a,d,f,g,l){2k{l=l||"0";V m="<i3 pY=\'\' 5V=\'"+l+"\'><i5 7E=\'"+g+"\'>"+a+"</i5><i4>"+N(d)+"</i4><8o>"+N(f)+"</8o></i3>";1a Z.1u.2z(m)}2j(e){1a 1s}},cf:W(a,d){2k{V f=Z.1u;V g=1s;if(d.1p>=2){g=f.7G(a,d[0],d[1]);1r(V l=2;l<d.1p;l++){g=f.7G(a,g,d[l])}}1f{g=f.7G(a,d[0])}1a g}2j(e){1a 1s}},i2:W(a,d){2k{V f="<?3i 3W=\'1.0\'?><5b><5O><8E>"+a+"</8E></5O></5b>";V g=Z.1u.2z(f);if(d){g.26.2V.2T(d.26.6D(1c))}1a g}2j(e){1a 1s}},7G:W(a,d,f){2k{V g="<i0><i1>"+a+"</i1></i0>";V l=Z.1u.2z(g);if(d){l.26.2T(d.26.6D(1c))}if(f){l.26.2T(f.26.6D(1c))}1a l}2j(e){1a 1s}},gd:W(a){1a Q(a)},gc:W(a){V d=Q(a);1a d?d.1V(6,8):1h},gb:W(a){V d=Q(a);1a d?(5L(d.1V(16,1))%2?"1":"2"):"0"},g9:W(a){V d=Q(a);V f=1d 3s();V g=5L(f.5T())-5L(d.1V(6,4));1a g},hZ:W(a){V d=\'<?3i 3W="1.0"?><5b 6u="aZ=7p-6u-cn" 3W="1.0"></5b>\';if(a){1a Z.1u.2z(d)}1a d},pX:W(a,d){V f=Z.1u;V g=f.hZ(1c);V l=g.26;if(1K a=="4W"){l.2T(a.26)}1f{l.2T(f.2z(a).26)}if(d){1a g}1a f.5N(g)},pW:W(a,d,f){V g=Z.1u;V l=g.2z(a);V m=14.3A("pV",f);V n,s;1r(V o=0;o<m.1p;o++){if(!m[o].1e("41")){4Y}n=(d?d:"/")+"/"+m[o].1e("41");V q=g.7F(l,n);s=q==1s?"":q.1z;if(s==""){4Y}2B(m[o].2H){1j"23":V r=m[o].1e("2N");V w=q.1e("7E");if(Z.1N(w)){m[o].5U=g.8B(r)(s)||s}1f{m[o].5U=w}1n;1j"1m":s=g.3Z(s).1V(0,8);m[o].5U=g.3V("6m","Y-m-d")(s);1n;1j"3B":s=g.3Z(s).1V(0,12);m[o].5U=g.3V("8A","Y-m-d H:i")(s);1n;1j"4A":s=g.3Z(s);m[o].5U=g.3V("aW","H:i")(s);1n;37:m[o].5U=s}}},hY:W(g,l,m,n){if(m===1h){V s=14.pU.6T.pT().pS;if(1K l=="3t"){l="2W="+l}1f{if(1K l=="4W"){l=14.pR(l)}}g+=(g.4v("?")!=-1?"&":"?")+l;s.b4("90",g,1h);s.hh(1s);1a s}14.6T.7W({1U:g,6S:"dT",2a:n,hX:1h,2E:1K l=="3t"?{2W:l}:l,4d:W(a,d,f){if(1K m=="W"){m.1i(U,d,f,a)}}})},6E:W(m,n){if(1K m=="3t"){m={1T:"",1U:m,4d:n}}14.6T.7W({1U:m.1U,6S:"90",hX:1h,4d:W(a,d,f){if(d){V g=97=f.6N;g=g.3U(/(?:<5h.*?>)((\\n|\\r|.)*?)(?:<\\/5h>)/ig,"");V l;if(!m.1T){l=14.5u.99("98",39.6c,g);14.2t(l).4l("x-2y-hW")}1f{14.5u.99("98",14.2e(m.1T),g)}S(97);if(m.hV!==1h){Z.8i(m.1T||g)}if(l){14.2t(l).3p()}}if(1K m.4d=="W"){m.4d.1i(U,d,f)}}})},pQ:W(a,d){if(1K a=="3t"){a={1T:"",82:a,4d:d}}V f=97=a.82;V f=f.3U(/(?:<5h.*?>)((\\n|\\r|.)*?)(?:<\\/5h>)/ig,"");V g;if(!a.1T){g=14.5u.99("98",39.6c,f);14.2t(g).4l("x-2y-hW")}1f{14.5u.99("98",14.2e(a.1T),f)}S(97);if(a.hV!==1h){Z.8i(a.1T||a.82)}if(g){14.2t(g).3p()}if(1K a.4d=="W"){a.4d.1i(U)}},3G:W(a,d){if(14.3M){1a a.3G(d)}1f{V f=1d hU();V g=f.hT(a.5Y==1s?a.26:a.5Y.26);V l=f.hS(d,a,g,pP.pO,1s);1a l.pN}},cd:W(a,d){if(33.91){1a a.cd(d)}1f{V f=1d hU();V g=f.hT(a.5Y==1s?a.26:a.5Y.26);V l=f.hS(d,a,g,0,1s);V m=[];V n;5B(n=l.pM()){m.1Y(n)}1a m}},pL:W(a,d){V a=a.3j==9?a:a.5Y;V f=1d hR();f.hQ(d);V g=f.hP(a,a);1a g.3i},bU:W(a,d,f){if(14.3M){a.bU(d,f)}1f{V a=(a.3j==9?a:a.5Y);V g=(f.3j==9?f:f.5Y);V l=1d hR();l.hQ(d);V m=l.hP(a,a);5B(f.hO()){f.pK(f.pJ)}V n=m.4D;V s=n.1p;1r(V o=0;o<s;o++){f.2T(g.pI(n[o],1c))}}},5N:W(a){if(14.3M){1a a.3i}1f{V d=1d hN();1a d.hM(a,"1z/3i")}},6U:W(a,d){if(14.3M){a.1z=d}1f{a.cc=d}},5K:W(a){if(14.3M){1a a.1z}1f{1a a.cc}},pH:W(a,d,f){1a M(a,d,f)}};1a F}();Z.1u=Z.1P.1u;Z.1P.2Q=W(){V x=["5l"];V A={pG:"5l"};V y=["71","g4","2u","b1","hJ","pF","hL","2a","g3","b8","7q","6t","4w","2m","hK"];V L="pE|pD|pC|6p|a3|pB|pA|eX|54|ac|pz|py|pw|hL|pv|pu|pt|2I|ps|pr|pq|pp|po|pn|pm|eC|5v|hK|pl|pk|pj|1T|pi|hJ|ph|8F|b5|72|3F|7k|aS|69|b2|3S|fH|fG|8p|27|4s|6b|5E|6O|fD|7A|pg|he|pf|6v";W B(a){1r(V d=0;d<x.1p;d++){if(a==x[d]){1a 1c}}1a 1h}W D(a){1a 4i("("+a+")")}W E(a){1a a==="1c"?1c:1h}W F(a){1r(V d=0;d<y.1p;d++){if(a==y[d]){1a 1c}}1a 1h}W C(a,d){if(Z.hI(d)){1a E(d)}if(a!="1q"&&d!=""&&(Z.96(d)||F(a))){1a D(d)}1a d}W I(a,d,f){if(!Z.1N(f)&&!Z.1N(f[a])){2B(f[a]){1j"g2":if(!Z.96(d)){1a d}1j"3b":1a D(d);1j"pe":1a E(d);1j"2F":1a d;37:}}1a C(a,d)}W P(a){1a Z.cb+a}1a{c9:/^pd/i,hH:W(a){1a{1T:a.7x,2I:a,3Q:a,21:{}}},3h:W(a,d,f){V g=Z.2t(a).1l;g.id=g.id||14.id();V l=U.hH(g);V m=g.bL;V n,s,o,q;1r(i=0;i<m.1p;i++){n=m.gj(i);s=n.pc;o=n.8r;q=n.8U;if(s){if(!B(o)){if(o=="id"){l[o]=P(q)}1f{V r=U.hG(o);if(1K r==="3t"){l.21[r]=q}1f{V w=Z.1G(A[o])?A[o]:o;if(!14.3M){V u=1d g8("\\\\b"+w+"\\\\b","gi");V v=L.6M(u);w=v!=1s?v[0]:w}l[w]=I(w,q,Z.1N(f)?d:f)}}}}}U.ca(g);1a l},ca:W(a){a.1E(Z.4Z,"1c")},b7:W(a){a=Z.2e(a);V d=1h;if(Z.1N(a.1e("3F"))){a.1E("3F",1c);d=1c}V f=a.1e("1x");f=f?f:"7c";V g=1d Z.5F[f](a);Z.4f(a,g);V l=g.1b;if(!d){1w l.3F}if(l.1T){1w l.1T}U.ca(a);1a l},hG:W(a){a=a.2C();if(U.c9.4X(a)){1a a.3U(U.c9,"")}1f{1a 1h}}}}();14.1C(14.1A.6f.pb,14.1A.6f,{2c:"4x",pa:W(){V a=U.p9;V d=U.p8();V f=d=="90";if(a.6q===1h||U.1A.8t()){14.6T.7W(14.1S(U.p7(a),{1A:U.1A.el.1l,1U:U.df(f),6S:d,hF:a.hF,2E:!f?U.p6():1s,dS:U.1A.aL}))}1f{if(a.6q!==1h){U.hE=14.1A.6f.p5;U.1A.c8(U,1h)}}},29:W(a){V d=U.ha(a);if(d===1c||d.29){U.1A.c8(U,1c);1a}if(d.95){U.1A.8S(d.95);U.hE=14.1A.6f.p4}U.1A.c8(U,1h)},p3:W(a){if(U.1A.hD){V d=U.1A.hD.p2(a);V f=[];if(d.6n){1r(V g=0,l=d.6n.1p;g<l;g++){V m=d.6n[g];f[g]=m.1M}}if(f.1p<1){f=1s}1a{29:d.29,95:f}}if((U.1A.hC!=1c&&U.1A.aL!=1c)||U.1A.hC===1h){if(U.1A.p1==1h){1a{29:1c}}1a U.hB(a)}1a 14.dk(a.6N)},hB:W(a){V d=Z.1u;V f=d.2z(a.6N);V g=d.c7(f,"p0");if(g=="0"||g=="oZ"){1a{29:1c}}1f{V l=d.c7(f,"oY");1a{29:1h,95:l}}}});14.1g.2d=14.1C(14.2d,{hx:1c,hw:1c,4j:1h,4c:W(a,d){V f=14.2e(U.6p||U.2I);if(!U.5X){if(f.3O.2C()=="4b"){if(!14.2d.c6){14.2d.c6=1d 14.6J(\'<2Y 4T="0" hA="0" 5Q="0" 1v="x-36-hz"><5d><1W>\',\'<1k 1v="x-36-49"><i>&#3e;</i></1k><1k 1v="x-36-3p"><em bB="on"></em></1k><1k 1v="x-36-4J"><i>&#3e;</i></1k>\',"</1W></5d></2Y>")}U.5X=14.2d.c6;U.4j=1c}1f{if(!14.2d.c5){14.2d.c5=1d 14.6J(\'<2Y 4T="0" hA="0" 5Q="0" 1v="x-36-hz"><5d><1W>\',\'<1k 1v="x-36-49"><i>&#3e;</i></1k><1k 1v="x-36-3p"><em bB="on"><4y 1v="x-36-1z" 2c="{1}">{0}</4y></em></1k><1k 1v="x-36-4J"><i>&#3e;</i></1k>\',"</1W></5d></2Y>")}U.5X=14.2d.c5}}V g,l=[U.1z||"&#3e;",U.2c];if(d){g=U.5X.8R(d,l,1c)}1f{g=U.5X.6Z(a,l,1c)}if(U.4j){U.68="4b:hy";14.2t(f).4l("x-36-1z");g.2l("em:hy").2T(f)}V m=g.2l(U.68);if(1K U.3k=="3t"){U.8w(m)}m.on("4e",U.bJ,U);m.on("f0",U.bI,U);U.oX(g,m);if(U.2v){U.el.2l(U.gN).4l("x-36-bz-2v")}14.oW.eG(U)},8w:W(a){V d=a.1l;d.1E("3k",U.3k);if(U.hx){if(U.4j){d.1q=d.1q+"("+U.3k+")"}1f{d.5c=d.5c+"("+U.3k+")"}}if(U.hw){d.1E("2w","\\oV\\oU\\hn: oT + "+U.3k)}},3J:W(){V a=U.el.2l(U.68);a.1l.2O=1h;14.1g.2d.1o.3J.1i(U)},48:W(){V a=U.el.2l(U.68);a.1l.2O=1c;14.1g.2d.1o.48.1i(U)}});14.1g.6F=W(g){14.1S(U,g,{1T:14.7V(),x:oS,y:7K,2K:hv,5k:hv,oR:1c,oQ:1h,a4:{oP:1h,oO:W(a){2k{V d=U.5y.2o();U.x=d.oN(1c);U.y=d.oM(1c);V f=U.7c.2o().oL;if(f){f.oK(U.x,U.y,d.9d(),d.6G())}}2j(a){}},oJ:W(a){2k{U.7c.h6(U.x,U.y)}2j(a){}}}});U.4C();14.1g.6F.1o.1L.1i(U);if(U.54==1h){U.2y()}};14.1C(14.1g.6F,14.32.3L,{54:1h,hi:Z.1u.8j()+"23",4m:4,92:{0:"\\hu",1:"\\44",2:"\\oI",3:"\\oH",4:"\\oG"},ht:"\\hu\\ba",hs:"\\6o\\aF\\oF",3v:"fd",3H:"fc",8Y:"oE",8X:"oD",7C:"1M",3I:"fe",5e:[],27:10,oC:1c,8F:1c,4C:W(){V a=Z.1u;if(!U.2m){U.2m=1d 14.1g.8V({27:U.27,2i:U.3I,hb:"@"+U.3v,7J:[{2b:U.3v,3R:"@"+U.3v},{2b:U.3H,3R:"@"+U.3H}]})}if(!U.7o){U.7o=[{73:U.ht,2K:oB,69:U.3v},{73:U.hs,2K:oA,69:U.3H,83:1c}]}V d=1d 14.b3({27:U.27,2m:U.2m});14.1S(U,{71:U.8F==1c?U.hm():1s,5w:U.5w||{6v:"\\fZ\\fY\\fX\\fW\\fV!",fU:"\\4o\\9q\\fT...",72:1c}});U.3a=a.2z();U.bT=a.2z();U.8Z=a.2z(U.oz||U.hr())},hr:W(){1a\'<?3i 3W="1.0" oy="ox"?><2s:ho 3W="1.0" ow:2s="fQ://7p.ov.ou/ot/os/oq"><2s:op oo-3i-om="hq" ol="hq"/><2s:5X 6M="/"><2s:93 2b="\'+U.7C+\'"><2s:94 2b="bV">ok</2s:94><2s:94 2b="bW">oj</2s:94><2s:1r-1X><2s:93 2b="\'+U.3I+\'"><2s:1r-1X 1Z="@*"><2s:hp 2b="{2b()}"><2s:1q-of 1Z="."/></2s:hp></2s:1r-1X></2s:93></2s:1r-1X></2s:93></2s:5X></2s:ho>\'},oi:W(){U.7D=1d 14.1A.4z({6v:"\\4o\\5m\\8s\\aK\\aJ\\7L\\hn\\6o",oh:1c});U.7D.on("1F",U.c0(U.7D),U);U.c4=1d 14.2d({1z:"\\aK\\aJ"});U.c4.on("3x",U.hk(U.7D,U.4m),U);U.c3=1d 14.2d({1z:U.92[U.4m],2u:U.c2()});1a 1d 14.4S([U.c3,"->",U.7D,U.c4])},hm:W(){1a 1d 14.b3({27:U.27,2m:U.2m})},c2:W(a){V d=U;1a W(){if(1K a=="3D"){if(d.92[d.4m+1]){d.4m=d.4m+1}1f{d.4m=0}}1f{if(a>=0&&a<4){d.4m=a}1f{1a}}d.c3.6U(d.92[d.4m])}},og:W(a){U.c2(a).1i(U)},4c:W(a,d){14.1g.6F.1o.4c.1i(U,a,d);U.el.on("eH",W(){U.7z=1c},U);U.el.on("oe",W(){U.7z=1h},U)},h5:W(a){U.5g=a;if(!U.5g.hl){U.c0(a).1i(U,a);U.5g.hl=1c}if(!U.od("8D")){U.on("8D",U.c1,U)}},h4:W(){U.oc("8D",U.c1,U);1w U.5g},c1:W(){if(!U.5g){1a}V a=U.6P().ob();U.5g.8T(a.1M[U.3v]);U.5g.3w(a.1M[U.3H]);U.5g.el.1l.4e();V d=U;7l(W(){d.2y()})},2y:W(){14.1g.6F.1o.2y.1i(U);U.7z=1h},c0:W(f){1a W(){V d="";f.el.on("oa",W(){V a=f.el.1l.1q;if(d!=a&&a!=f.6v){U.bX(a);if(U.4n){U.8x()}d=a}},U)}},hk:W(a,d){1a W(){U.bX(a.7r(),d)}},7y:W(a){if(U.5e[a]&&a.1V(0,1)!="#"){U.3a=U.5e[a]}1f{U.5e[a]=Z.1P.1u.2z();U.5e[a].bZ=1h;U.3a=U.5e[a];if(a.1V(0,1)=="#"){V d=39.o9(a.1V(1));if(d.3i==""){3r 0}U.3a.hj(d.3i)}1f{V f=U.hi+"/"+a+".3i";if(33.91){U.3a.6E(f)}1f{if(39.bY&&39.bY.2z){V g=1d 33.o8();g.b4("90",f,1h);g.hh(1s);U.3a=g.bO}}U.5e[a]=U.3a}}},as:W(a){2k{U.7y(a);U.7f(U.3a);1a 1c}2j(b){1a 1h}},bX:W(a,d){if(!U.3a&&!U.8Z){1a 1h}V f=U.8Z.26;V g=Z.1u.3G(f,"//2s:1r-1X");if(a!=""){2B(d||U.4m){1j 0:g.1E("1Z","//"+U.3I+"[o7-bz(@"+U.3v+",\'"+a+"\')]");1n;1j 1:g.1E("1Z","//"+U.3I+"[5W(@"+U.3H+",\'"+a+"\')]");1n;1j 2:a=a.2C();g.1E("1Z","//"+U.3I+"[5W(@"+U.8Y+",\'"+a+"\')]");1n;1j 3:a=a.2C();g.1E("1Z","//"+U.3I+"[5W(@"+U.8X+",\'"+a+"\')]");1n;1j 4:a=a.2C();g.1E("1Z","//"+U.3I+"[5W(@"+U.3H+",\'"+a+"\') or 5W(@"+U.8Y+",\'"+a+"\') or 5W(@"+U.8X+",\'"+a+"\') or 5W(hg(@"+U.3v+",$bW, $bV),hg(\'"+a+"\', $bW, $bV))]");1n;37:g.1E("1Z","//"+U.3I)}Z.1u.bU(U.3a,U.8Z,U.bT);U.7f(U.bT)}1f{U.7f(U.3a)}},7f:W(a){U.2Z().hd(a);U.2Z().6E()},7r:W(a){V d;V f=U.7C+"/"+U.3I+"[@"+U.3v+"=\'"+a+"\']";V g=Z.1u.3G(U.3a,f);if(g!=1s){d=g.1e(U.3H)}1a d},bG:W(a){V d;V f=U.7C+"/"+U.3I+"[@"+U.3H+"=\'"+a+"\']";V g=Z.1u.3G(U.3a,f);if(g!=1s){d=g.1e(U.3v)}1a d},bS:W(a){V d=U.7C+"/"+U.3I;V f=d+"[@"+U.3v+"=\'"+a+"\']|"+d+"[@"+U.3H+"=\'"+a+"\']|"+d+"[@"+U.8Y+"=\'"+a+"\']|"+d+"[@"+U.8X+"=\'"+a+"\']";V g=Z.1u.3G(U.3a,f);1a g},8t:W(a){if(U.bS(a)==1s){1a 1h}1a 1c},h1:W(a){V d=U.bS(a);V f=d.1e(U.3v);V g=d.1e(U.3H);1a{28:f,1q:g,0:f,1:g}},o6:W(a){V d=U.2Z().fJ(a);if(1K d=="3D"){1a d}V f=d.2g(U.3v);V g=d.2g(U.3H);1a{28:f,1q:g,0:f,1:g}}});14.1g.3L=14.1C(14.32.3L,{o5:W(a){1a U.hf(a,1c)},hf:W(f,g){V l=U.6P().dp();V m=U.2Z();V n=m.3f.3P;V s=n.8p||n.2i;V o=n.id;if(g==1c&&1K o=="3D"){3r 1d bR("8k\\o4\\ga\\fB\\o3!")}V q="<bQ>";14.1X(l,W(a){q+=(g==1c?"<"+s+\' 5f="2" 8W="0">\':"<"+s+">");1r(V d in a.1M){if(g==1c&&d==o){q+="<"+d+\' 5V="0" 1B="5">\'+a.1M[d]+"</"+d+">";1n}1f{q+="<"+d+">"+a.1M[d]+"</"+d+">"}}q+="</"+s+">"});q+="</bQ>";if(f==1c){1a Z.1u.2z(q)}1a q},o2:W(a){V d=U.2m.3f.fi;if(a==1c){1a d}1a Z.1u.5N(d)}});14.8G("g0",14.1g.3L);14.1g.7B=W(a){14.1S(U,a);14.1g.7B.1o.1L.1i(U)};14.1C(14.1g.7B,14.1M.85,{27:10,6E:W(a){a=a||{2E:{4q:0,b0:U.27}};if(U.2M("aP",U,a)!==1h){U.o1(a);V d=14.1S(a.2E||{},U.4s);if(U.6b&&U.he){V f=U.o0;d[f.nZ]=U.6b.84;d[f.nY]=U.6b.et}V g=a.2E.4q;V l=a.2E.b0;V m=fP.fO((g+U.27)/U.27);V n=U.hc(m);V s=U.3f.fj(n);s.3S=U.3S;V o=U.nX(s,a,1c);1a 1c}1f{1a 1h}},hd:W(a){U.bP=a},nW:W(a){U.3S=a},hc:W(a){V d=14.fh;V f=U.bP.26||U.bP;V g=d.1Z(U.3f.3P.2i,f);V l=g[0]?g[0].7x.6D(1h):f.6D(1h);U.3S=g.1p;1r(V m=(a-1)*U.27;m<g.1p;m++){if(m>=a*U.27){1n}l.2T(g[m].6D(1c))}1a l}});14.8G("nV",14.1g.7B);14.1g.8V=14.1C(14.1g.7B,{1L:W(a){14.1g.8V.1o.1L.1i(U,14.1S(a,{id:a.hb||a.id,3f:1d 14.1M.52(a)}))}});14.8G("nU",14.1g.8V);14.1g.aQ=14.1C(14.2J.6s,{h9:1,h8:3,ha:W(a,d,f){V g=a.bO;g=(Z.1u.5N(g)==""?Z.1u.2z(a.6N):g);V l;if(U.7A){l=Z.1u.3G(g,U.7A.4v("//")==0?U.7A:"//"+U.7A)}1f{l=g.26||g}2k{d.nT();d.2T(U.bN(l));d.nS();if(1K f=="W"){f(U,d)}}2j(c){U.nR(a)}},bN:W(l){V m=[];14.1X(l.4D,W(a){if(a.3j==U.h9){V d=U.bK(a);if(a.4D.1p>0){d.bM=1c;V f=U.bN(a);if(1K f=="3t"){d.bL.5U=f}1f{d.2T(f)}}1f{if(U.bM!=1h){d.9b=1c;d.bM=1c}}m.1Y(d)}1f{if(a.3j==U.h8){V g=a.8U.b9();if(g.1p>0){1a m=g}}}},U);1a m},bK:W(d){V f={};14.1X(d.bL,W(a){if(a.8r==U.nQ){f.1z=a.8U}1f{f[a.8r]=a.8U}},U);U.h7(f,d);1a 14.1g.aQ.1o.bK.1i(U,f)},h7:14.5j});14.1g.3C=14.1C(14.1A.nP,{nO:1c,3z:W(){14.1g.3C.1o.3z.1i(U);U.9Z("nN","1Z")},4c:W(a,d){14.1g.3C.1o.4c.1i(U,a,d);U.23=Z.8n()},nM:W(a){if(a.nL()==a.nK){U.nJ(a)}},bJ:W(){if(U.2O||U.2o().1l.2O||U.2o().1l.bi){1a}14.1g.3C.1o.bJ.1i(U);V a=U.2o();V d=a.nI();V f,g=a.nH();V l=U.23.el.6G();if((g+l)>39.6c.nG){f=g-l}1f{f=g+a.6G()}U.23.h6(d,f);U.23.h5(U);V m=U;7l(W(){m.23.as(m.el.1l.1e("2N"));if(!m.23.7z){m.23.8x()}})},bI:W(a){14.1g.3C.1o.bI.1i(U);U.h2();if(!U.23.7z){U.23.h4();U.23.2y()}},gh:W(){if(U.2O||U.2o().1l.2O||U.2o().1l.bi){1a}U.el.4e()},8T:W(a){U.2o().1l.1E("28",a)},nF:W(d,f){V g;V l=U.23.2Z();if(l.9x()>0){l.1X(W(a){if(a.1M[d]==f){g=a;1a 1h}})}1a g},bG:W(){1a U.2o().1l.1e("28")},8S:W(a){14.1g.3C.1o.8S.1i(U,a);U.8T("")},h3:W(a){V d=14.1g.3C.1o.h3.1i(U,a);if(d&&a!=""){1a U.bH(a)}1a d},h2:W(){V a=U.2o().1l.1q;if(a!=""&&U.23.5e[U.2o().1l.1e("2N")]){if(U.bH(a)==1h){1a 1h}V d=U.23.h1(a);U.8T(d[0]);U.3w(d[1])}1a 1c},bH:W(a){U.23.7y(U.2o().1l.1e("2N"));if(!U.23.8t(a)){U.8S(U.nE);1a 1h}1a 1c},nD:W(a,d){U.23.7y(a);1a U.23.bG(d)}});14.1g.8K=W(a){14.1g.8K.1o.1L.1i(U,a)};14.1C(14.1g.8K,14.nC,{gV:"bj bF",gU:"bk bF",gC:"h0 4I",gT:"bj nB",gS:"bk bF",nA:"h0 4H",4G:"H",7t:"M",by:W(){U.3w(1d 3s().6B());V a=U.1q;a.gZ(U.2r);a.gY(U.2q);U.2M("1Z",U,a)},gO:W(a,d){a.bo();if(d.8O&&!14.2t(d.7x).nz("x-1m-2O")){U.3w(1d 3s(d.8O));V f=U.1q;f.gZ(U.2r);f.gY(U.2q);U.2M("1Z",U,f)}},4c:W(d,f){V g=[\'<2Y 5Q="0">\',\'<1W><1k 1v="x-1m-49"><a 2f="#" 2w="\',U.ny,\'">&#3e;</a></1k><1k 1v="x-1m-5R" 6y="3p"></1k><1k 1v="x-1m-4J"><a 2f="#" 2w="\',U.nx,\'">&#3e;</a></1k></1W>\',\'<1W><1k 8M="3"><2Y 1v="x-1m-bA" 5Q="0"><gW><1W>\'];V l=U.nw;1r(V m=0;m<7;m++){V n=U.bx+m;if(n>6){n=n-7}g.1Y("<gX><7w>",l[n].1V(0,1),"</7w></gX>")}g[g.1p]="</1W></gW><5d><1W>";1r(V m=0;m<42;m++){if(m%7==0&&m!=0){g[g.1p]="</1W><1W>"}g[g.1p]=\'<1k><a 2f="#" nv="on" 1v="x-1m-1m" nu="1"><em><7w></7w></em></a></1k>\'}g.1Y("</1W></5d></2Y></1k></1W>",\'<1W><1k 8M="3" 1v="nt" 6y="3p"><2Y 5Q="0"><1W>\',\'<1k 1v="y-4I-49"><a 2f="#" 2w="\',U.gV,\'">&#3e;</a></1k><1k 1v="y-4I-5R" 6y="3p"></1k><1k 1v="y-4I-4J"><a 2f="#" 2w="\',U.gU,\'">&#3e;</a></1k>\',\'<1k 1v="y-4H-49"><a 2f="#" 2w="\',U.gT,\'">&#3e;</a></1k><1k 1v="y-4H-5R" 6y="3p"></1k><1k 1v="y-4H-4J"><a 2f="#" 2w="\',U.gS,\'">&#3e;</a></1k>\',"</1W></2Y></1W>",U.8I?\'<1W><1k 8M="3" 1v="x-1m-gM" 6y="3p"></1k></1W>\':"",\'</2Y><1D 1v="x-1m-mp"></1D>\',\'<1D 1v="x-1m-mp x-mp-1m"></1D><1D 1v="x-1m-mp x-mp-4I"></1D><1D 1v="x-1m-mp x-mp-4H"></1D>\');V s=39.7i("1D");s.3X="x-1m-4F";s.5c=g.4u("");d.1l.8R(s,f);U.el=14.2g(s);U.7v=14.2g(s.2V);1d 14.1P.6C(U.el.2l("1k.x-1m-49 a"),{2u:U.bC,2a:U,gR:1c,gQ:1c});1d 14.1P.6C(U.el.2l("1k.x-1m-4J a"),{2u:U.bD,2a:U,gR:1c,gQ:1c});1d 14.1P.6C(U.el.2l("1k.y-4I-49 a"),{2u:W(){if(U.2r>0){U.2r--;U.2r=U.2r%24;V a="";if(U.2r<10){a="0"+U.2r}1f{a=U.2r}U.6x.2G(a+U.4G)}}.5x(U),2a:U});1d 14.1P.6C(U.el.2l("1k.y-4I-4J a"),{2u:W(){U.2r++;U.2r=U.2r%24;V a="";if(U.2r<10){a="0"+U.2r}1f{a=U.2r}U.6x.2G(a+U.4G)}.5x(U),2a:U});1d 14.1P.6C(U.el.2l("1k.y-4H-49 a"),{2u:W(){if(U.2q>0){U.2q--;U.2q=U.2q%60;V a="";if(U.2q<10){a="0"+U.2q}1f{a=U.2q}U.6w.2G(a+U.7t)}}.5x(U),2a:U});1d 14.1P.6C(U.el.2l("1k.y-4H-4J a"),{2u:W(){U.2q++;U.2q=U.2q%60;V a="";if(U.2q<10){a="0"+U.2q}1f{a=U.2q}U.6w.2G(a+U.7t)}.5x(U),2a:U});U.7v.on("ns",U.nr,U);U.gP=U.el.8Q("1D.x-mp-1m");U.gP.bE("89");U.3u=U.el.8Q("1D.x-mp-4I");U.3u.bE("89");U.3Y=U.el.8Q("1D.x-mp-4H");U.3Y.bE("89");V o=1d 14.nq(U.7v,{49:W(a){a.6i?U.bC():U.2G(U.5P.3d("d",-1))},4J:W(a){a.6i?U.bD():U.2G(U.5P.3d("d",1))},bn:W(a){a.6i?U.np():U.2G(U.5P.3d("d",-7))},8Q:W(a){a.6i?U.nn():U.2G(U.5P.3d("d",7))},nm:W(a){U.bD()},nl:W(a){U.bC()},nk:W(a){a.eF();1a 1c},2a:U});U.7v.on("3x",U.gO,U,{nj:"a.x-1m-1m"});U.el.bB();U.5S=U.el.1Z("2Y.x-1m-bA 5d 1k");U.gK=U.el.3A("2Y.x-1m-bA 5d 7w");U.7u=1d 14.2d({1z:"&#3e;",3o:U.ni,1T:U.el.2l("1k.x-1m-5R",1c)});U.7u.on("3x",U.nh,U);U.7u.el.2l(U.7u.gN).4l("x-36-bz-2v");V q=1d 3s();U.2r=q.gr();U.2q=q.ng();U.6x=U.el.2l("1k.y-4I-5R");U.6x.on("3x",U.gB,U);U.6w=U.el.2l("1k.y-4H-5R");U.6w.on("3x",U.gv,U);if(U.8I){U.nf=U.7v.ne(14.nd.nc,U.by,U);V r=(1d 3s()).8z(U.3m);U.nb=1d 14.2d({1T:U.el.2l("1k.x-1m-gM",1c),1z:2F.3m(U.gI,r),3o:2F.3m(U.na,r),2u:U.by,2a:U})}if(14.3M){U.el.n9()}U.2G(U.1q)},2G:W(l,m){V n=U.5P;U.5P=l;if(!m&&n&&U.el){V s=l.8P();if(n.6A()==l.6A()&&n.5T()==l.5T()){U.5S.bp("x-1m-64");U.5S.1X(W(a){if(a.1l.2V.8O==s){a.4l("x-1m-64");7l(W(){2k{a.1l.2V.4e()}2j(t){}},50);1a 1h}});1a}}V o=l.gL();V q=l.n8();V r=q.gH()-U.bx;if(r<=U.bx){r+=7}V w=l.3d("mo",-1);V u=w.gL()-r;V v=U.5S.n7;V x=U.gK;o+=r;V A=n6;V y=(1d 3s(w.5T(),w.6A(),u)).6B();V L=1d 3s().6B().8P();V B=l.6B().8P();V D=U.bh?U.bh.6B():gJ.n5;V E=U.bg?U.bg.6B():gJ.n4;V F=U.gg;V C=U.bf;V I=U.8J?U.8J.4u(""):1h;V P=U.be;V M=U.3m;V N=W(a,d){d.2w="";V f=y.8P();d.2V.8O=f;if(f==L){d.3X+=" x-1m-n3";d.2w=a.gI}if(f==B){d.3X+=" x-1m-64";7l(W(){2k{d.2V.4e()}2j(H){}},50)}if(f<D){d.3X=" x-1m-2O";d.2w=a.bd;1a}if(f>E){d.3X=" x-1m-2O";d.2w=a.bb;1a}if(I){if(I.4v(y.gH())!=-1){d.2w=P;d.3X=" x-1m-2O"}}if(F&&M){V g=y.8z(M);if(F.4X(g)){d.2w=C.3U("%0",g);d.3X=" x-1m-2O"}}};V z=0;1r(;z<r;z++){x[z].5c=(++u);y.bw(y.8N()+1);v[z].3X="x-1m-n2";N(U,v[z])}1r(;z<o;z++){gG=z-r+1;x[z].5c=(gG);y.bw(y.8N()+1);v[z].3X="x-1m-n1";N(U,v[z])}V O=0;1r(;z<42;z++){x[z].5c=(++O);y.bw(y.8N()+1);v[z].3X="x-1m-n0";N(U,v[z])}U.7u.6U(U.mZ[l.6A()]+" "+l.5T());if(U.2r<10){6z="0"+U.2r}1f{6z=U.2r}U.6x.2G(6z+U.4G);if(U.2q<10){6z="0"+U.2q}1f{6z=U.2q}U.6w.2G(6z+U.7t);if(!U.gE){V J=U.el.1l.2V;V K=J.bu;U.el.gF(K+U.el.mY("lr"));14.2t(J).gF(K);U.gE=1c;if(14.mX&&!U.gD){J.bv[0].5S[1].5l.2K=(K-(J.bv[0].5S[0].bu+J.bv[0].5S[2].bu))+"px";U.gD=1c;U.2G.mW(10,U,[l])}}},gA:W(){if(!U.3u.1l.2V){V g=[\'<2Y  4T="1" 5Q="0"\'];g.1Y(\'<1W ><1k 1v="x-1m-5R" 6y="3p"  8M="4">\',U.gC,"</1k></1W>");1r(V l=0;l<24;l+=4){g.1Y(\'<1W><1k 1v="x-1m-mp-2A"><a 2f="#">\',l+U.4G,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',(l+1)+U.4G,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',(l+2)+U.4G,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',(l+3)+U.4G,"</a></1k></1W>")}U.3u.2G(g.4u(""));U.3u.on("gw",U.gy,U);U.bt=U.3u.1Z("1k.x-1m-mp-2A");U.bt.1X(W(a,d,f){a.1l.bs=f})}},gB:W(){U.gA();V a=U.el.gs();U.3u.8L(a);U.3u.2l("2Y").8L(a);U.gz(U.2r);U.3u.ag("t",{6g:0.2})},gz:W(g){U.bt.1X(W(a,d,f){a[a.1l.bs==g?"4l":"bp"]("x-1m-mp-gp")})},gy:W(a,d){a.bo();V f=1d 14.gn(d),g;if(g=f.bn("1k.x-1m-mp-2A",2)){U.2r=g.1l.bs;U.6x.2G(U.2r+U.4G);U.gx()}},gx:W(a){if(U.3u){if(a===1c){U.3u.2y()}1f{U.3u.ae("t",{6g:0.2})}}},gu:W(){if(!U.3Y.1l.2V){V g=[\'<2Y 4T="1" 5Q="0"\'];1r(V l=0;l<55;l+=7){g.1Y(\'<1W><1k 1v="x-1m-mp-2A"><a 2f="#">\',l,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',l+1,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',l+2,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',l+3,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',l+4,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',l+5,"</a></1k>",\'<1k 1v="x-1m-mp-2A"><a 2f="#">\',l+6,"</a></1k> </1W>")}g.1Y(\'<1W><1k 1v="x-1m-mp-2A"><a 2f="#">56</a></1k>\',\'<1k 1v="x-1m-mp-2A"><a 2f="#">57</a></1k>\',\'<1k 1v="x-1m-mp-2A"><a 2f="#">58</a></1k>\',\'<1k 1v="x-1m-mp-2A"><a 2f="#">59</a></1k>\',\'<1k 1v="x-1m-mp-2A"><a 2f="#">60</a></1k>\');U.3Y.2G(g.4u(""));U.3Y.on("gw",U.go,U);U.bq=U.3Y.1Z("1k.x-1m-mp-2A");U.bq.1X(W(a,d,f){a.1l.bm=f})}},gv:W(){U.gu();V a=U.el.gs();U.3Y.8L(a);U.3Y.2l("2Y").8L(a);U.mV=(U.5P||U.1q).gr();U.gq(U.2q);U.3Y.ag("t",{6g:0.2})},gq:W(g){U.bq.1X(W(a,d,f){a[a.1l.bm==g?"4l":"bp"]("x-1m-mp-gp")})},go:W(a,d){a.bo();V f=1d 14.gn(d),g;if(g=f.bn("1k.x-1m-mp-2A",2)){U.2q=g.1l.bm;U.6w.2G(U.2q+U.7t);U.gm()}},gm:W(a){if(U.3u){if(a===1c){U.3Y.2y()}1f{U.3Y.ae("t",{6g:0.2})}}},mU:"bk gl (gk+mT)",mS:"bj gl (gk+mR)"});14.1g.7s=W(d){14.1g.7s.1o.1L.1i(U,1d 14.1g.8K(d),d);U.4F=U.mQ;U.9Z({1Z:1c});U.4F.on("1F",W(a){a.2o().mP("3x");a.a7.4l("x-2v-1m-gj")});U.4F.on("1Z",U.9g,U)};14.1C(14.1g.7s,14.2v.mO,{9g:W(a,d){U.2M("1Z",U,d,a);14.1g.7s.1o.mN.1i(U)}});14.1g.8H=W(a){14.1g.8H.1o.1L.1i(U,a);U.a5=1c;V d=1d 14.1g.7s(a);U.3d(d);U.4F=d.4F;U.mM(d,["1Z"])};14.1C(14.1g.8H,14.2v.mL,{cl:"x-1m-2v",mK:W(){U.4F.4r()}});14.8q(14.1A.51,{gh:W(){if(U.2O||U.el.1l.bi){1a}if(U.2v==1s){U.2v=1d 14.2v.mJ()}14.1S(U.2v.4F,{bh:U.ar,bg:U.aq,gg:U.mI,bf:U.bf,8J:U.8J,be:U.be,3m:U.3m,8I:U.8I,bd:2F.3m(U.bd,U.gf(U.ar)),bb:2F.3m(U.bb,U.gf(U.aq))});U.2v.on(14.1S({},U.mH,{2a:U}));U.2v.4F.3w(U.7r()||1d 3s());U.2v.8x(U.el,"ge-bl?")}});14.1g.4B=14.1C(14.1A.51,{f8:"6m|m/d/Y|m-d-y|m-d-Y|m/d|m-d|d|Y\\7e\\7d\\5I|8A|m/d/Y H:i|m-d-y H:i|m-d-Y H:i|m/d H:i|m-d H:i|d H:i|Y\\7e\\7d\\5I H\\aV\\aU",3m:"Y-m-d H:i",3z:W(){U.2v=1d 14.1g.8H();14.1g.4B.1o.3z.1i(U)}});14.8G("f7",14.1g.4B);14.1S(14.1A.fv,{fp:W(a,d){V f=Z.1u;V g=Z.1u.gd(a);if(g==1h){1a 1h}V l=d.el.1l;l.1q=g;2k{V m=l.1e("mG");if(m){V n=14.2e(m);V s=f.gc(g);n.1q=f.3V("6m","Y-m-d")(s);n.1E("28",s)}}2j(k){}2k{V o=l.1e("mF");if(o){V q=14.2e(o);V r=f.gb(g);q.1E("28",r);q.1q=(r=="1"?"\\mE":(r=="2"?"\\mD":"\\ga\\mC\\4L\\mB\\mA"))}}2j(k){}2k{V w=l.1e("mz");if(w){V u=14.2e(w);V v=f.g9(g);u.1q=v}}2j(k){}1a 1c},my:"\\4o\\5m\\mx\\mw\\fl\\4L\\mv\\mu\\fo\\fm\\mt\\ba",ms:W(a,d){V f=1d g8("^[\\\\mq-\\\\mn]+$","");V g=f.4X(a);if(g){1a 1c}1f{1a 1h}},mm:"\\4o\\5m\\8s\\61\\44\\6o\\mk\\mj"});14.8q(14.1A.3g,{mi:W(){if(U.1q!==3D){U.3w(U.1q)}1f{if(U.el.1l.1q.1p>0&&U.el.1l.1q!=U.6v){U.3w(U.el.1l.1q)}}U.g7=U.7r();U.g6=U.el.1l.28},3l:W(){U.3w(U.g7);if(U.el){U.el.1l.28=U.g6}U.fa()}});Z.3E=W(a){U.3z(a)};Z.3E.7M={3F:1h,1t:1h,1b:{},mh:Z.5j,1R:Z.5j,aG:Z.5j,3z:W(a){U.1R.1i(U,a);U.aG.1i(U,a);if(U.1b.3F!==1c){U.1F.1i(U)}},1F:Z.5j,on:W(n){if(Z.1N(U.1b.3T)){U.1b.3T={}}W s(a){1a a.g5(0,a.4v("(")).b9()}W o(a){V d=[];V f=a.g5(a.4v("(")+1,a.7h(")"));if(!Z.1N(f)){V g=f.6W(",");1r(V l=0;l<g.1p;l++){d.1Y(4i(g[l]))}}1a d}W q(m){1a W(){V a=o.1i(r.1b.3Q,n[m]);V d=r.aY.1i(U,m,6I);1r(V f=0;f<d.1p;f++){a.1Y(d[f])}1r(V g=0;g<6I.1p;g++){a.1Y(6I[g])}V l=s(n[m]);if(1K 33[l]==="W"&&l!=="ed"){1a 4i(l+".1S(U,a)")}1f{1a 4i(n[m])}}}1r(ce in n){V r=U;U.1b.3T[ce]=q(ce)}},aY:W(){1a[]}};Z.4S=W(a){Z.4S.1o.1L.1i(U,a)};Z.1C(Z.4S,Z.3E,{1x:"an",1R:W(a){V d=U.2R(a);if(Z.1G(d.1x)){1w d.1x}U.on(d.21);1w d.21;1w d.2I;Z.1S(U.1b,d);Z.1S(U.1b,U.2U(a))},1F:W(){if(!U.1t){V a=1d 14.4S(U.1b);U.1y=a;U.1t=1c}},2U:W(a){V d=Z.2e(a);V f={};V g=d.4D;V l;1r(V m=0;m<g.1p;m++){l=g[m];if(l.3j==1){if(!Z.1G(f.2S)){f.2S=[]}if(l.1e("1z")=="-"||l.1e("1z")==" "||l.1e("1z")=="->"||l.1e("1z")=="fA"){f.2S.1Y(l.1e("1z"))}1f{if(l.1e("1x")=="4y"||Z.1N(l.1e("1x"))){if(l.3O.2C()=="1D"){l.1E("3F",1c);V n=1d Z.2d(l);1w n.1b.1T;n.1F();f.2S.1Y(n.1y)}1f{f.2S.1Y(l)}}}}}1a f},2R:W(a){V d=Z.1P.2Q;1a d.3h(a,U.2X,U.4k)}});Z.4h=W(a){Z.4h.1o.1L.1i(U,a)};Z.1C(Z.4h,Z.3E,{1x:"7c",4k:1s,2X:1s,1R:W(a){V d=U.2R(a);if(Z.1G(d.1x)){d.1x=U.1x}Z.1S(d,U.2U(a));U.1b=d;U.on(U.1b.21);1w U.1b.21},1F:W(){if(!U.1t){V a=1d 14.4h(U.1b);U.1y=a;U.1t=1c}},2R:W(a){V d=Z.1P.2Q;1a d.3h(a,U.2X,U.4k)},2U:W(a){V d=Z.2e(a);V f={};V g=d.4D;V l;1r(V m=0;m<g.1p;m++){l=g[m];if(l.3j==1){V n=l.1e("6l");if(n!=1s){if(!Z.1G(f.a2)){f.a2="4T"}if(!Z.1G(f.2S)){f.2S=[]}V s=Z.1P.2Q;V o=s.b7(l);f.2S.1Y(o)}1f{V q=U.4E(l);Z.34(f,q)}}}1a f},4E:W(a){V d={};V f=a.1e("1x");V g=f;V l=1h;2B(f){1j"71":1j"g4":f="an";l=1c;1n;1j"7q":1r(V m=a.2V;m;m=m.7m){if(m.3j==1){if(m.3O.2C()=="1D"){m.1E("3F",1c);V n=1d Z.2d(m);1w n.1b.1T;n.1F();if(!Z.1G(d.7q)){d.7q=[]}d.7q.1Y(n.1y)}}}1n;1j"g3":1j"b1":1j"b8":37:1n}if(l){a.1E("3F",1c);V s=1d Z.5F[f](a);1w s.1b.1T;s.1F();d[g]=s.1y}1a d}});Z.79=W(){Z.79.1o.1L.1i(U,Z.7V())};Z.1C(Z.79,Z.4h,{1x:"mg",1F:W(){if(!U.1t){V a=1d 14.79(U.1b);U.1y=a;U.1t=1c}}});Z.5H=W(a){Z.5H.1o.1L.1i(U,a)};Z.1C(Z.5H,Z.4h,{1x:"f5",2X:{g1:"g2"},1R:W(a){Z.5H.1o.1R.1i(U,a);V d={mf:1c,g1:0};Z.34(U.1b,d);if(Z.1G(U.1b.2I)){1w U.1b.2I}},1F:W(){if(!U.1t){V a=1d 14.5H(U.1b);U.1y=a;U.1t=1c}},2U:W(a){V d=Z.2e(a);V f={};V g=d.4D;V l;1r(V m=0;m<g.1p;m++){G=g[m];if(G.3j==1){V l=G.1e("2w");if(!Z.1N(l)){G.3X="x-2y-eI";if(!Z.1G(f.2S)){f.2S=[]}V n=Z.1P.2Q;f.2S.1Y(n.b7(G))}1f{V s=U.4E(G);Z.34(f,s)}}}1a f},4E:W(a){V d=Z.5H.1o.4E.1i(U,a);V f=a.1e("1x");if(f){}1a d}});Z.3L=W(a){Z.3L.1o.1L.1i(U,a)};Z.1C(Z.3L,Z.4h,{1x:"g0",27:10,2X:{cm:"3b",b2:"3b",7o:"3b",b6:"3b",me:"3b",5w:"3b"},1R:W(a){U.1b=U.2R(a);U.27=U.1b.27||U.27;if(Z.1G(U.1b.1x)){U.1b.1x=U.1x}U.1b.b6=U.1b.b6||{md:"\\9w\\mb..."};V d={6v:"\\fZ\\fY\\fX\\fW\\fV!",fU:"\\4o\\9q\\fT...",72:U.1b.72};U.1b.5w=Z.1G(U.1b.5w)?Z.34(U.1b.5w,d):d;Z.1S(U.1b,U.2U(a));if(U.1b.8F||U.1b.b5){V f={27:U.27,2m:U.1b.2m,ma:U.1b.b5?1h:1c,m9:"\\m8\\m7\\m6 {0} - {1} \\fS \\fR {2} \\fS",2S:["-",{1z:"m5"+Z.3W+" \\fR\\m4\\m3",3o:"",2u:W(){33.b4("fQ://7p.6u.cn/m2.m1")}}]};U.1b.71=1d 14.b3(f)}U.on(U.1b.21);1w U.1b.21},1F:W(){if(!U.1t){V a=1d 14.1g.3L(U.1b);U.1y=a;U.1t=1c}},4E:W(o){V q=Z.3L.1o.4E.1i(U,o);V r=o.1e("1x");2B(r){1j"fI":V w=1d Z.6a(o);if(!w.1t){w.1F()}q.b2=w.1y;if(w.5M){q.m0=w.5M}q.b1=w.8C;Z.4f(o,w.1y);1n;1j"2m":1j"ao":14.2e(o).1E("27",U.27);V u=1d Z.7a(o);if(!u.1t){u.1F()}q.2m=u.1y;Z.4f(o,u.1y);V v=U;u.1y.8f("aP",W(a,d){V f=d.2E?d.2E.4q:0;V g=d.2E?d.2E.b0:10;V l=fP.fO((f+v.27)/v.27);V m=v.fN(u.1b.3Q.1e("2W"),l,v.27);V n={2W:m};Z.1S(u.1y.4s,n);V s=Z.2e(o).1e("1U");u.1y.5y.f9().1U=s});1n;37:1n}1a q},fM:W(a,d){1a\'<?3i 3W="1.0"?><5b lZ="aZ=7p-6u-cn" 3W="1.0"><5O fL="\'+(a||1)+\'" fK="\'+(d||10)+\'"><8E></8E></5O></5b>\'},fN:W(a,d,f){V g="";2k{if(!a){if(a===""){1a""}g=U.fM(d,f)}1f{V l=Z.1u;V m=l.2z(a);l.5a(m,"5O","fL",d);l.5a(m,"5O","fK",f);g=l.5N(m)}}2j(e){g=a}1a g},aY:W(a,d){V f=[];2B(a){1j"8D":1j"lY":1j"lX":1j"lW":1j"lV":1j"lU":1j"lT":1j"lS":f.1Y(U.2Z().fJ(d[1]).1M);1n;37:1n}1a f}});Z.7a=W(a){Z.7a.1o.1L.1i(U,a)};Z.1C(Z.7a,Z.3E,{1x:"ao",2X:{4s:"3b",6b:"3b"},4k:1s,1R:W(a){U.1b=U.2R(a);if(Z.1G(U.1b.1x)){1w U.1b.1x}1w U.1b.1U;U.1b.5y=1d 14.1M.aw();U.on(U.1b.21);1w U.1b.21;1w U.1b.1T;1w U.1b.2I;Z.1S(U.1b,U.2U(a))},1F:W(){if(!U.1t){V a=1d 14.1M.lR(U.1b);U.1y=a;U.1t=1c}},2U:W(a){V d=Z.2e(a);V f={};1r(V g=d.2V;g;g=g.7m){if(g.3j==1){V l=g.1e("1x");if(!Z.1N(l)){V m=1d Z.5F[l](g);f[l.4v("3f")!=-1?"3f":l]=m.1y}}}if(Z.1N(f.3f)){V m=1d Z.5F.8k(d);f.3f=m.1y}1a f},2R:W(a){V d=Z.1P.2Q;1a d.3h(a,U.2X,U.4k)}});Z.6a=W(a){Z.6a.1o.1L.1i(U,a)};Z.1C(Z.6a,Z.3E,{1x:"fI",1t:1h,1b:{},2X:1s,1R:W(a){U.1b=U.2R(a);if(Z.1G(U.1b.1x)){1w U.1b.1x}if(Z.1G(U.1b.1T)){1w U.1b.1T}if(Z.1G(U.1b.2I)){1w U.1b.2I}U.on(U.1b.21);1w U.1b.21;Z.1S(U.1b,U.2U(a))},1F:W(){if(!U.1t){V a=1d 14.32.6a(U.1b);U.1y=a;U.1t=1c}},2U:W(a){V d=Z.1P.1u;V f=Z.1P.2Q;V g=Z.2e(a);V l={7o:[1d 14.32.lQ()]};1r(V m=g.2V;m;m=m.7m){if(m.3j==1){V n=f.3h(m,U.2X,U.4k);if(n.2c=="8g"){U.5M=1d 14.32.aX({lP:1c});n=U.5M}1f{if(n.2c=="lO"){U.5M=1d 14.32.aX();n=U.5M}1f if(n.2c=="8C"){U.5M=1d 14.32.aX();U.8C=4i("("+n.lN+")");n=U.8C}1f{if(n.2H&&!n.4w){2B(n.2H){1j"23":n.4w=d.8B(n.2N);1n;1j"1m":n.4w=d.3V("6m","Y\\7e\\7d\\5I");1n;1j"3B":n.4w=d.3V("8A","Y\\7e\\7d\\5I H\\aV\\aU");1n;1j"4A":n.4w=d.3V("aW","H\\aV\\aU");1n}}}}l.7o.1Y(n)}}1a l},2R:W(a){V d=Z.1P.2Q;1a d.3h(a,U.2X,U.4k)}});Z.52=W(a){U.4C(a);U.6r()};Z.52.7M={1x:"8k",1t:1h,1b:{},2X:1s,4k:{id:"2F",2i:"2F",29:"2F",3S:"2F",aT:"2F",8p:"2F"},4C:W(a){U.1b=U.1R(a);if(Z.1G(U.1b.aT)){U.1b.id=U.1b.aT}if(Z.1G(U.1b.1x)){1w U.1b.1x}if(Z.1G(U.1b.1T)){1w U.1b.1T}if(Z.1G(U.1b.2I)){1w U.1b.2I}1w U.1b.21;Z.34(U.1b,{3S:"fb@6n"});Z.1S(U.1b,U.2U(a))},6r:W(){if(!U.1t){V a=14.1M.eB.a6(U.1b.3R);V d=1d 14.1M.52(U.1b,a);U.1y=d;U.1t=1c}},2U:W(a){V d=Z.2e(a);V f={3R:[]};1r(V g=d.2V;g;g=g.7m){if(g.3j==1){V l=Z.1P.2Q;V m=l.3h(g,"",{2b:"2F",3R:"2F",2c:"2F",fH:"3b",fG:"2F",fg:"3b",8z:"2F"});f.3R.1Y(m)}}1a f},1R:W(a){V d=Z.1P.2Q;1a d.3h(a,U.2X,U.4k)}};Z.5G=W(a){Z.5G.1o.1L.1i(U,a)};Z.1C(Z.5G,Z.4h,{1x:"7b",2X:{7n:"3b"},1R:W(a){Z.5G.1o.1R.1i(U,a);if(Z.1N(U.1b.6t)){U.1b.6t=U.8y()}if(Z.1N(U.1b.7n)){U.1b.7n=U.aR()}if(Z.1N(U.1b.aS)){U.1b.aS=1h}},1F:W(){if(!U.1t){V a=1d 14.2J.5G(U.1b);U.1y=a;U.1t=1c}},4E:W(a){V d=Z.5G.1o.4E.1i(U,a);V f=a.1e("1x");if(Z.1N(f)){1a}2B(f){1j"6t":d.6t=U.8y(a);1n;1j"lM":d.6t=U.8y(a,1c);1n;1j"7n":d.7n=U.aR(a);1n;37:1n}1a d},8y:W(a,d){if(Z.1G(a)){if(d==1c){Z.2t(a).1l.1E("fF",1c)}1a 1d Z.6s(a).1y}1a 1d 14.2J.6s()},aR:W(a){if(Z.1G(a)){1a 1d Z.aN(a).1y}1a 1d 14.2J.fE({1z:"lL lK",a4:1h,lJ:1c})}});Z.6s=W(a){if(Z.1G(a)){U.4C(a)}U.6r()};Z.1C(Z.6s,Z.3E,{1b:{},4C:W(a){U.1b=U.1R(a);if(Z.1N(U.1b.1U)&&Z.1N(U.1b.aO)){U.1b.aO="#"}U.on(U.1b.21);1w U.1b.21;1w U.1b.1T;1w U.1b.2I;1w U.1b.1x},1R:W(a){V d=Z.1P.2Q;1a d.3h(a)},6r:W(){if(!U.1t){if(U.1b.fF){U.1y=1d 14.1g.aQ(U.1b)}1f{U.1y=1d 14.2J.6s(U.1b)}V a=U;U.1y.8f("aP",W(){U.1U=a.1b.3Q.1e("1U")||a.1b.3Q.1e("aO");14.1S(U.4s,{2W:a.1b.3Q.1e("2W")||""})});U.1t=1c}}});Z.aN=W(a){if(Z.1G(a)){U.4C(a)}U.6r()};Z.1C(Z.aN,Z.3E,{1b:{},4C:W(a){U.1b=U.1R(a);Z.1S(U.1b,U.2U(a));U.on(U.1b.21);1w U.1b.21;1w U.1b.1T;1w U.1b.2I;1w U.1b.1x},1R:W(a){V d=Z.1P.2Q;1a d.3h(a)},2U:W(a){V d={};V f=Z.2t(a).1l;V g=Z.1P.2Q;1r(V l=f.2V;l;l=l.7m){if(l.3j==1){if(!Z.1G(d.aM)){d.aM=[]}V m=U.1R(l);V n={1b:m};U.on.1i(n,m.21);if(l.2V){Z.1S(m,U.2U(l))}1f{m.9b=1c}d.aM.1Y(m)}}1a d},6r:W(){if(!U.1t){U.1y=1d 14.2J.fE(U.1b);U.1t=1c}}});Z.4U=W(a){Z.4U.1o.1L.1i(U,a)};Z.1C(Z.4U,Z.4h,{1x:"33",54:1h,2X:{lI:"3b",lH:"3b"},1R:W(a){Z.4U.1o.1R.1i(U,a);if(Z.1N(U.1b.6O)){U.1b.6O="2y"}U.54=U.1b.54;1w U.1b.54;Z.2t(a).4l("x-4n")},1F:W(){if(!U.1t){V a;if(U.1b.fD==1c){a=1d 14.1g.5C(U.1b)}1f{if(U.1b.aL==1c){if(U.1b.4p){U.1b.4p=4i(U.1b.4p)}a=1d 14.1g.1I.63(U.1b)}1f{a=1d 14.4U(U.1b)}}if(U.54==1c){7l(W(){a.8x(39.6c)},1)}U.1y=a;U.1t=1c}}});Z.2d=W(a){Z.2d.1o.1L.1i(U,a)};Z.1C(Z.2d,Z.3E,{1x:"4y",7k:1c,4j:1h,2X:{2v:"3b"},1R:W(a){U.1b=U.2R(a);if(Z.1G(U.1b.1x)){U.1b.1x=U.1x}if(Z.1N(U.1b.1z)){U.1b.1z=Z.2t(a).1l.1q}U.8w();if(Z.2t(a).1l.3O.2C()=="4b"){U.4j=1c;Z.2t(a).1l.1q=U.1b.1z;if(Z.1N(U.1b.2I)){U.1b.2I=a}if(Z.1N(U.1b.6p)){U.1b.6p=a}1w U.1b.1T}1f{Z.1S(U.1b,U.2U(a))}if(U.1b.7k==1h){U.7k=1h}U.on(U.1b.21);1w U.1b.21},1F:W(){if(!U.1t){V a=1d 14.1g.2d(U.1b);U.1y=a;U.1t=1c}},8w:W(){V a,d;a=U.1b.1z.3U(/\\s/g,"");d=a.7h("#");if(d>-1){U.1b.3k=a.1V(d+1,1).lG();U.1b.1z=U.1b.1z.1V(0,d)}1f{if(U.7k){U.fC()}}},fC:W(){V a=U.1b.1z.3U(/\\s/g,"");2B(a){1j"\\cN\\9l":1j"\\lF\\fB":U.1b.3k="O";1n;1j"\\cV\\cU":1j"\\7L\\cR":U.1b.3k="C";1n;1j"\\aK\\aJ":U.1b.3k="Q";1n;1j"\\lE\\lD":U.1b.3k="B";1n;1j"\\lC\\9s":U.1b.3k="G";1n;1j"\\lB\\lA":U.1b.3k="S";1n;1j"\\lz\\ly\\lx\\cY":U.1b.3k="N";1n}},2U:W(a){V d=Z.2e(a);V f={};V g=d.4D;V l;1r(V m=0;m<g.1p;m++){l=g[m];if(l.3j==1){if(!Z.1G(f.2v)){f.2v={2S:[]}}if(l.3O.2C()=="1D"){if(l.1e("1z")=="fA"||l.1e("1z")=="-"){f.2v["2S"].1Y(l.1e("1z"))}1f{l.1E("3F",1c);V n=1d Z.2d(l);1w n.1b.1T;f.2v["2S"].1Y(n.1b)}}1f{f.2v["2S"].1Y(l)}}}1a f},2R:W(a){V d=Z.1P.2Q;1a d.3h(a,U.2X,U.4k)}});Z.5D=W(a){U.el=a;Z.5D.1o.1L.1i(U,a)};Z.1C(Z.5D,Z.3E,{1R:W(s){U.1b=U.2R(s);U.on(U.1b.21);if(Z.2t(s).1l.3O.2C()=="1A"){if(!Z.1G(U.1b.1U)){U.1b.fx=1c}V o={};if(Z.1G(U.1b.3T.5s)){o.5s=U.1b.3T.5s;1w U.1b.3T.5s}if(Z.1G(U.1b.3T.29)){o.29=U.1b.3T.29;1w U.1b.3T.29}if(Z.1G(U.1b.3T.7j)){o.7j=U.1b.3T.7j}if(Z.1G(U.1b.6q)){o.6q=U.1b.6q}if(Z.1G(U.1b.8v)){o.8v=U.1b.8v}if(Z.1G(U.1b.8u)){o.8u=U.1b.8u}W q(n){Z.34(n,{8v:"\\lw\\lv\\lu\\ls...",8u:"\\lq\\lp"});1a W(a,d){V f=Z.1u;if(a!=1c){if(1K a=="3t"){n.6q=1h;U.2W=a}1f{U.2W=d?f.fz(U):f.fy(U)}}if(U.fx){if(U.el.1l.fw!=1s){if(U.el.1l.fw.1i(U)==1h){1a 1h}}1f{if(1K n.7j=="W"){if(n.7j.1i(U)==1h){1a 1h}}}V g=U.8t();if(g){if(a!=1c){if(!U.el.1l.1e("aH")){V l=14.id();V m=39.7i("4b");m.1E("id",l);m.1E("2c","4n");m.1E("2b","2W");m.1E("aI","1c");m.1E("1q",U.2W);U.el.1l.2T(m);U.el.1l.1E("aH",l)}1f{14.2e(U.el.1l.1e("aH")).1q=U.2W}}U.el.1l.4x()}1f{if(1K n.5s=="W"){n.5s.1i(U)}}1a g}n.2E=n.2E||{};if(U.el.1l.1e("4s")){Z.1S(n.2E,4i("("+U.el.1l.1e("4s")+")"))}Z.1S(n.2E,{2W:U.2W});n.1U=U.el.1l.1e("1U");U.lo("4x",n);1a U}}U.1b.4x=q(o)}if(Z.1G(U.1b.3F)){1w U.1b.3F}1w U.1b.21;1w U.1b.1T;1w U.1b.2I},1F:W(){if(!U.1t){V a=1d 14.1A.5D(U.el,U.1b);U.1y=a;U.1t=1c}},2R:W(a){V d=Z.1P.2Q;1a d.3h(a)}});Z.3g=W(a){Z.3g.1o.1L.1i(U,a)};Z.1C(Z.3g,Z.3E,{1x:"84",4j:1h,1R:W(a){U.1b=U.2R(a);if(Z.1G(U.1b.1x)){U.1b.1x=U.1x}V d=Z.2e(a);if(!Z.1G(U.1b.5E)&&U.1b.8h==1c){U.1b.5E=1c}V f=d.3O.2C();if(f=="4b"||f=="8e"){U.4j=1c;if(Z.1N(U.1b.6p)){U.1b.6p=a}if(d.1e("2H")=="23"||d.1e("2H")=="1m"||d.1e("2H")=="3B"||d.1e("2H")=="4A"){V g=14.2g(a);V l=g.ln("2K");if(l.7h("%")==-1&&l!="lm"){if(!14.3M&&l=="ll"){d.1E("6e",22)}1f{g.9O("2K",5L(l)-16)}}1f{d.1E("6e",22)}}1f{d.1E("6e",25)}1w U.1b.1T}Z.1u.av(d);U.on(U.1b.21);1w U.1b.21;1w U.1b.2I},aG:W(a){V d=Z.2e(a);V f=U.fu(d);if(f){d.1E("2P:9T",f)}V g=d.1e("2H");if(g&&4i("(14.1A.fv."+g+")")){Z.34(U.1b,{lk:g})}},1F:W(){if(!U.1t){V a=1d 14.1A.3g(U.1b);U.1y=a;U.1t=1c}},2R:W(a){V d=Z.1P.2Q;1a d.3h(a)},fu:W(a){V d;2B(a.1e("2H")){1j"23":d=a.1e("53")||"\\4o\\d1\\6o\\aF\\61\\9p\\9o\\aC\\lj";1n;1j"1m":d=a.1e("53")||"\\5I\\ft\\aE\\aD fq-10-10";1n;1j"4A":d=a.1e("53")||"\\fs\\fr\\aE\\aD 13:10";1n;1j"3B":d=a.1e("53")||"\\5I\\ft\\li\\fs\\fr\\aE\\aD fq-10-10 13:10";1n;1j"fp":d=a.1e("53")||"\\fo\\fm\\lh\\lg \\lf\\le\\ld \\lc \\cB 18\\fl";1n;1j"5A":d=a.1e("53")||"\\4o\\5m\\8s\\lb\\aC";1n;1j"77":d=a.1e("53")||"\\4o\\5m\\8s\\aC\\6o";1n;37:d=a.1e("53")||""}1a d}});Z.4z=W(a){Z.4z.1o.1L.1i(U,a)};Z.1C(Z.4z,Z.3g,{1x:"f4",1F:W(){if(!U.1t){V a=1d 14.1A.4z(U.1b);U.1y=a;U.1t=1c}}});Z.78=W(a){Z.78.1o.1L.1i(U,a)};Z.1C(Z.78,Z.3g,{1x:"4n",1F:W(){if(!U.1t){V a=1d 14.1A.78(U.1b);U.1y=a;U.1t=1c}}});14.8q(14.1A.7g,{la:W(){if(!U.l9){V d=U.l8().1Z("4b[2b="+U.el.1l.2b+"][2c=8g]");d.1X(W(a){if(a.1l.id==U.id){U.3w(1c)}1f{14.fk(a.1l.id).3w(1h)}},U)}}});Z.7g=W(a){Z.7g.1o.1L.1i(U,a)};Z.1C(Z.7g,Z.3g,{1x:"8g",1F:W(){if(!U.1t){U.1b.id=U.1b.3Q.id=U.1b.3Q.id||14.id();U.1b.2u=U.1b.3Q.l7;V a=1d 14.1A.7g(U.1b);U.1y=a;U.1t=1c}}});Z.3C=W(a){Z.3C.1o.1L.1i(U,a)};Z.1C(Z.3C,Z.3g,{1x:"l6",1F:W(){if(!U.1t){V a=1d 14.1g.3C(U.1b);U.1y=a;U.1t=1c}}});Z.76=W(a){Z.76.1o.1L.1i(U,a)};Z.1C(Z.76,Z.3g,{1F:W(){if(!U.1t){V a=1d 14.1A.76(U.1b);U.1y=a;U.1t=1c}}});14.1M.aB=W(a,d){a=a||{};14.1M.aB.1o.1L.1i(U,a,d||a.7J)};14.1C(14.1M.aB,14.1M.52,{fj:W(a){U.fi=a;V d=a.26||a;V f=14.fh;V g=U.l5,l=g.7M.7J;V m=U.3P.id;V n=0,s=1c;if(U.3P.3S){n=f.l4(U.3P.3S,d,0)}if(U.3P.29){V o=f.aA(U.3P.29,d,1c);s=o!==1h&&o!=="1h"}V q=[];V r=f.1Z(U.3P.2i,d);1r(V w=0,u=r.1p;w<u;w++){V v=r[w];V x={};V A=m?f.aA(m,v):3D;if(U.3P.5J){1r(V y=0,L=l.1p;y<L;y++){V B=l.2S[y];V D=f.aA(B.3R||B.2b,v,B.l3);D=B.fg(D,v);x[B.2b]=D}}1f{1r(V E=0,F=v.4D.1p;E<F;E++){V C=v.4D[E];if(C.8r=="l2"){4Y}if(!x.1q){x.1q=Z.1u.5K(C)}1f{if(!x.1z){x.1z=Z.1u.5K(C)}1f{1n}}}}V I=1d g(x,A);I.l1=v;q[q.1p]=I}1a{29:s,6n:q,3S:n||q.1p}}});14.8q(14.1A.5i,{l0:W(){if(U.el.1l.1q.1p>0){U.el.1l.1q=U.az===3D?"":U.az;U.kZ()}1f{U.au.1q=""}}});Z.5i=W(a){Z.5i.1o.1L.1i(U,a)};Z.1C(Z.5i,Z.3E,{4j:1h,1R:W(a){U.1b=U.2R(a);V d=Z.2e(a);if(d.3O.2C()=="1Z"){U.4j=1c;if(Z.1N(U.1b.ff)){U.1b.ff=a}U.1b.kY={6Y:"4b",2c:"1z",6e:"22",ax:1c,kX:"kW"};1w U.1b.1T;V f=d.1e("7b");if(f!=1s){V g=Z.ay(f);1w g.1b.1T;1w g.1b.1t;U.1b.2J=14.kV.a6(g.1b,g.1b.1x||"7b")}}U.1b.au=14.2g(a).kU(14.34({6Y:"4b",2c:"4n",id:d.id||14.id(),kT:U.1b.id,2H:"1Z",ax:1c},U.1b),"kS",1c);if(d.1e("2N")!=1s){V l=d.1e("2N");l=l?(d.1e("kR")||(Z.1u.8j()+"23/"))+l+".3i":"";U.1b.2m=1d 14.1M.85({5y:1d 14.1M.aw({1U:""}),3f:1d 14.1M.52({2i:"fe"},[{2b:"1q",3R:"@fd",2c:"3t"},{2b:"1z",3R:"@fc",2c:"3t"}])})}1f{if(d.1e("1U")!=1s){U.1b.2m=1d 14.1M.85({5y:1d 14.1M.aw({1U:""}),3f:1d 14.1M.52({2i:d.1e("8p")||"kQ",3S:d.1e("kP")||"fb@6n"},[{2b:"1q",3R:(d.1e("8l")||"kO")},{2b:"1z",3R:(d.1e("5J")||"8o")}])})}}if(U.1b.8h==1c){U.1b.5E=1h}Z.1u.av(d);U.on(U.1b.21);1w U.1b.21;1w U.1b.2I},1F:W(){if(!U.1t){if(!U.1b.9h){U.1b.9h="7I"}if(1K U.1b.9f=="3D"){U.1b.9f=1c}if(1K U.1b.2N!="3D"){U.1b.cw="cv"}V a;if(U.1b.7b){a=1d 14.1g.6H(U.1b)}1f{a=1d 14.1A.5i(U.1b)}if(U.1b.2m){a.on("kN",U.at,U)}a.kM="1q";a.kL="1z";a.fa();U.1b.3Q=a.au;U.1y=a;U.1t=1c}},2R:W(a){V d=Z.1P.2Q;1a d.3h(a)},at:W(){V a=U.1b;if(!a.2m){1a 1h}V d=a.3Q;V f=d.1e("2N");V g=d.1e("1U");14.1S(a.2m.4s,{2W:d.1e("2W")});if(1K U.1b.2N!="3D"){if(f!=a.2N||!a.8m){V l=Z.8n();l.as(f);V m=l.3a.26;a.2m.7f(m);a.2N=f;a.8m=1c}1a}if(1K U.1b.1U!="3D"){if(g!=a.1U||!a.8m){a.2m.5y.f9().1U=g;a.1U=g;a.8m=1c;1w U.1y.kK}}if(d.1e("8l")||d.1e("5J")){V n=d.1e("8l")||d.1e("5J");V s=d.1e("5J")||n;a.2m.3f.3P.8l=n;a.2m.3f.3P.5J=s}}});Z.6k=W(a){Z.6k.1o.1L.1i(U,a)};Z.1C(Z.6k,Z.3g,{1x:"kJ",1R:W(a){Z.6k.1o.1R.1i(U,a);V d={};if(U.1b.2H=="5A"){d.kI=1h}if(U.1b.ap){V f=4i(U.1b.ap);d.ar=f[0];d.aq=f[1];1w U.1b.ap}Z.34(U.1b,d)},1F:W(){if(!U.1t){V a=1d 14.1A.6k(U.1b);U.1y=a;U.1t=1c}}});Z.51=W(a){Z.51.1o.1L.1i(U,a)};Z.1C(Z.51,Z.3g,{1x:"kH",1R:W(a){Z.51.1o.1R.1i(U,a);if(14.2t(a).1l.1q=="f6"){U.1b.1q=1d 3s}Z.34(U.1b,{f8:"6m|m/d/Y|m-d-y|m-d-Y|m/d|m-d|d|Y\\7e\\7d\\5I",3m:"Y-m-d"})},1F:W(){if(!U.1t){V a=1d 14.1A.51(U.1b);U.1y=a;U.1t=1c}}});Z.6j=W(a){Z.6j.1o.1L.1i(U,a)};Z.1C(Z.6j,Z.3g,{1x:"kG",1R:W(a){Z.6j.1o.1R.1i(U,a);Z.34(U.1b,{3m:"G:i"})},1F:W(){if(!U.1t){V a=1d 14.1A.6j(U.1b);U.1y=a;U.1t=1c}}});Z.4B=W(a){Z.4B.1o.1L.1i(U,a)};Z.1C(Z.4B,Z.3g,{1x:"f7",1R:W(a){Z.4B.1o.1R.1i(U,a);if(14.2t(a).1l.1q=="f6"){U.1b.1q=1d 3s}},1F:W(){if(!U.1t){V a=1d 14.1g.4B(U.1b);U.1y=a;U.1t=1c}}});Z.5F={7c:Z.4h,f5:Z.5H,7b:Z.5G,32:Z.3L,ao:Z.7a,8k:Z.52,33:Z.4U,4y:Z.2d,an:Z.4S,f4:Z.4z};14.eY(W(){V a=Z.1u.8j();14.kF=a+"kE/37/s.kD";14.6X.4C();if(Z.kC!==1h){V d=1d Z.79();Z.4f(Z.7V(),d);Z.8i()}kB=1c});Z.8i=W(o){V q=Z.1P.1u;1r(5t in Z.5F){V r="1D[1x=\'"+5t+"\'][6l!=\'3p\'][6l!=\'kA\'][6l!=\'kz\'][6l!=\'ky\'][6l!=\'kx\']["+Z.4Z+"!=\'1c\']";V w=Z.3A(r,o);Z.1X(w,W(a){V d=1d Z.5F[5t](a);Z.4f(a,d)})}Z.1X(Z.3A(".am-4g",o),W(a){q.f3(a)});V u=Z.3A("4b["+Z.4Z+"!=\'1c\']",o);Z.1X(u,W(a){V d;V f=a.1e("2c");V g=a.1e("8h");if(Z.1N(a.1e("5E"))&&g=="1c"){a.1E("5E","1h")}2B(f){1j"8g":1n;1j"4y":1j"4x":1j"3l":d=1d Z.2d(a);1n;1j"4n":d=1d Z.78(a);1n;1j"f2":a.1E("f1","f2");d=1d Z.4z(a);1n;1j"2h":a.1E("f1","2h");d=1d Z.4z(a);1n;37:V l=a.1e("2H");2B(l){1j"23":d=1d Z.3C(a);1n;1j"5A":1j"77":d=1d Z.6k(a);1n;1j"1m":d=1d Z.51(a);1n;1j"3B":d=1d Z.4B(a);1n;1j"4A":d=1d Z.6j(a);1n;1j"kw":1n;37:d=1d Z.4z(a)}}if(d){Z.4f(a,d)}});V v=Z.3A("1Z["+Z.4Z+"!=\'1c\']",o);Z.1X(v,W(a){V d=1d Z.5i(a);Z.4f(a,d)});V x=Z.3A("8e["+Z.4Z+"!=\'1c\']",o);Z.1X(x,W(a){V d=1d Z.76(a);Z.4f(a,d)});V A=Z.3A("1A["+Z.4Z+"!=\'1c\']",o);Z.1X(A,W(f){V g=1d Z.5D(f);V l=Z.3A("*["+Z.4Z+"=\'1c\']",f);V m;1r(V n=0;n<l.1p;n++){V s=Z.al(l[n]);if(!s){4Y}m=Z.al(l[n]).1y;2B(l[n].2c){1j"4y":1n;1j"4x":m.on("3x",g.1y.4x,g.1y);1n;1j"3l":m.on("3x",g.1y.3l,g.1y);1n;37:m.8f("4e",W(a){V d=a.2o().1l;q.ak(d,"#kv");d.1Z()});m.8f("f0",W(a){q.ak(a.2o().1l,"#ku")});g.1y.3d(m)}}Z.4f(f,g)})};Z.kt=W(m,n){V s=W(){V l=14.3A(".x-1A-84,.x-36-1z",n);14.1X(l,W(d,f,g){14.2t(d).ks([{eZ:[13,40,aj],fn:W(a){2k{if(g[f].3O.2C()=="8e"){if(3N.6i==1c){g[f+1].4e()}}1f{g[f+1].4e()}}2j(j){3N.kr=9}if(g[f+1]&&/4y|3l|4x/.4X(g[f+1].2c)&&(a==13||a==aj)){g[f+1].3x()}1a 1c}},{eZ:38,fn:W(a){2k{if(g[f].3O.2C()=="8e"){if(3N.6i==1c){g[f-1].4e()}}1f{g[f-1].4e()}}2j(j){}if(g[f-1]&&/4y|3l|4x/.4X(g[f-1].2c)&&(a==13||a==aj)){g[f-1].3x()}}}])})};14.kq?s():14.eY(s)};14.1g.75={74:[]};14.1g.5C=14.1C(14.4U,{3z:W(){14.34(U,{5v:"kp-ko",2K:kn,5k:7K,ai:1c,eX:1c,a3:1c,a5:1h});if(U.ai){U.ah=1d 14.1P.km(U.2y,U)}14.1g.5C.1o.3z.1i(U)},kl:W(a){U.6c.2G(a)},eW:W(a,d){14.1g.5C.1o.eW.1i(U,a,d||U.5v)},4c:W(a,d){14.1g.5C.1o.4c.1i(U,a,d)},87:W(){14.1g.75.74.31(U.6h);14.1g.5C.1o.87.1i(U)},af:W(){14.1g.5C.1o.af.1i(U);if(U.ai){U.on("kk",W(){14.1g.75.74.31(U.6h);U.ah.kj()},U);U.ah.ki(kh)}},kg:W(){U.6h=0;5B(14.1g.75.74.4v(U.6h)>-1){U.6h++}14.1g.75.74.1Y(U.6h);U.el.kf(39,"br-br",[-20,-20]);U.el.ag("b",{6g:1,4d:U.af,2a:U})},ke:W(){U.el.kd();U.el.ae("b",{6g:1,4d:W(){U.el.2y();U.kc()},2a:U})}});14.eJ("14.1g.5z");14.1g.5z.eU=W(f,g){if(!f){3r"kb is ka."}U.2u=f;U.2a=g||33;U.5o=[];U.8d=1h;U.2x=W(a,d){d=d||1s;U.5o.1Y({3N:a,1M:d});if(!U.8d){U.eV()}};U.4O=W(){U.5o=[]},U.eV=W(){5B(U.5o.1p>0){U.8d=1c;V a=U.5o.k9();U.2u.1i(U.2a,a.3N,a.1M)}U.8d=1h}};14.1g.5z.86=W(a,d,f){U.3q=a;U.8c=d||{};U.ad=f||33;14.1g.5z.86.1o.1L.1i(U,U.eT,U)};14.1C(14.1g.5z.86,14.1g.5z.eU,{3q:1s,8c:1s,ad:1s,1B:W(){1a U.3q},eT:W(a,d){V f=U.eP(a);if(!f){3r"eS \'"+U.3q+"\' eR no eQ 1r 3N \'"+a+"\'."}1r(V g=0,l=f.1p;g<l;g++){V m=f[g];V n=m.35||m.p||1c;V s=m.1J||m.a||14.5j;V o=m.1B||m.s||U.3q;V q=m.2a||U.ad;if(U.eO(n,q,d,a)){U.eL(s,q,d,a);U.3q=o;1a}}3r"eS \'"+U.3q+"\' eR no eQ 1r 3N \'"+a+"\' in k8 k7"},eP:W(a){1a U.8c[U.3q]?U.8c[U.3q][a]||1h:1h},eO:W(a,d,f,g){V l=1h;2B(14.2c(a)){1j"W":l=a.1i(d,f,g,U);1n;1j"eK":l=1c;1r(V m=0,n=a.1p;l&&(m<n);m++){if(14.2c(a[m])=="W"){l=a[m].1i(d,f,g,U)}1f{3r["eM: ",a[m],\' is 8b 8a in "\',U.3q,\'" 1B 1r 3N "\',g].4u("")}}1n;1j"eN":l=a;1n;37:3r["eM: ",a,\' is 8b 8a in "\',U.3q,\'" 1B 1r 3N "\',g].4u("")}1a l},eL:W(a,d,f,g){2B(14.2c(a)){1j"eK":1r(V l=0,m=a.1p;l<m;l++){if(14.2c(a[l])=="W"){a[l].1i(d,f,g,U)}1f{3r["6f: ",a[l],\' is 8b 8a in "\',U.3q,\'" 1B 1r 3N "\',g].4u("")}}1n;1j"W":a.1i(d,f,g,U);1n;37:3r["6f: ",a,\' is 8b 8a in "\',U.3q,\'" 1B 1r 3N "\',g].4u("")}}});14.eJ("14.1g.1I");14.1g.1I.4V=14.1C(14.2d,{9V:"2h",2p:1s,88:1s,a8:1s,3z:W(){14.1g.1I.4V.1o.3z.1i(U);U.88=U.2u||1s;U.a8=U.2a||33;U.2u=1s;U.2a=1s},4c:W(a,d){14.1g.1I.4V.1o.4c.1i(U,a,d);U.a9()},a9:W(){V d=U.el.2l(".x-36-3p");d.9Y("k6");U.2p=14.5u.6Z(d,{6Y:"4b",2c:"2h",6e:1,2b:U.9V||14.id(U.el),5l:"9Y: 9X; eI: 89; 4T: k5; k4: k3"},1c);U.2p.k2(0);U.ab();if(U.k1){U.2p.on("eH",U.k0,U);U.2p.on("jZ",U.jY,U)}if(U.3o){if(1K U.3o=="4W"){14.6X.eG(14.1S({jX:U.2p},U.3o))}1f{U.2p.1l[U.7X]=U.3o}}U.2p.on("7R",U.eD,U);U.2p.on("3x",W(a){a.eF()})},ac:W(){14.1g.1I.4V.1o.ac.1i(U);U.ab()},ab:W(){V a,d,f,g;if(U.el&&U.2p){a=U.el.2l(".x-36-3p");d=a.eE();U.2p.9O("aa-6e",(d.2K*0.5)+"px");f=U.2p.eE();g={x:3,y:3};if(14.3M){g={x:-3,y:3}}U.2p.jW(d.2K-f.2K+g.x+"px");U.2p.jV(d.5k-f.5k+g.y+"px")}},7S:W(a){V d=U.2p;a=a||1h;if(1K U.3o=="4W"){14.6X.jU(U.2p)}1f{U.2p.1l[U.7X]=1s}U.2p.dD();U.2p=1s;if(!a){U.a9()}1a d},9Q:W(){1a U.2p},48:W(){14.1g.1I.4V.1o.48.1i(U);U.2p.1l.2O=1c},3J:W(){14.1g.1I.4V.1o.3J.1i(U);U.2p.1l.2O=1h},4r:W(){V a=U.7S(1c);a.31();a=1s;14.1g.1I.4V.1o.4r.1i(U)},eD:W(){if(U.88){U.88.1i(U.a8,U)}}});14.1g.1I.9W=14.1C(14.1g.1I.4V,{eC:1c,87:W(){14.1g.1I.9W.1o.87.1i(U);if(U.a7){U.a7.31()}}});14.1g.1I.2L=14.1M.eB.a6([{2b:"47"},{2b:"1B",2c:"5A"},{2b:"4P"},{2b:"65"},{2b:"2E"}]);14.1g.1I.2L.7O=0;14.1g.1I.2L.dK=1;14.1g.1I.2L.7U=2;14.1g.1I.2L.7N=3;14.1g.1I.63=W(a){V d={4T:1h,2K:eA,5k:ez,jT:eA,jS:ez,a5:1c,jR:1c,a4:1c,jQ:1c,jP:1h,jO:1h,9i:1c,a3:1c,6O:"2y",2w:U.1H.2w,eo:"2P-1g-3c-jN",1U:"",7P:{},4p:[],9z:1c,9B:1h,9D:1h,eq:"2h"};a=14.34(a||{},d);a.a2="9X";14.1g.1I.63.1o.1L.1i(U,a)};14.1C(14.1g.1I.63,14.4U,{2n:1s,9U:1s,1A:1s,2D:1s,7Z:1s,5n:1h,67:0,4Q:1s,3z:W(){14.1g.1I.63.1o.3z.1i(U);V a={ex:{"33-1F":[{1J:[U.ew,U.ev,U.eu],1B:"ey"}],4r:[{1J:U.4O,1B:"6d"}]},ey:{"32-1F":[{1J:[U.er,U.3K],1B:"4a"}],4r:[{1J:U.4O,1B:"6d"}]},4a:{"2h-64":[{35:[U.9R,U.9S],1J:U.9P,1B:"a0-2h"},{1J:U.9F}],"32-9E-7R":[{1J:U.3K}],"31-do":[{1J:[U.dY,U.dX]}],"3l-5o":[{1J:[U.9M,U.9L]}],"4q-1O":[{35:U.4M,1J:[U.e1,U.e3,U.3K,U.3n,U.66,U.e0],1B:"a1"},{}],"7Q-1O":[{}],2y:[{35:[U.dd,U.9A],1J:[U.9M,U.9L]},{}],4r:[{1J:U.4O,1B:"6d"}]},"a0-2h":{"2h-eb":[{35:U.9y,1J:[U.e2,U.3n,U.80],1B:"a1"},{35:U.de,1J:[U.dh,U.80],1B:"4a"},{1J:[U.3K,U.80],1B:"4a"}]},a1:{"2h-64":[{35:[U.9R,U.9S],1J:U.9P,1B:"a0-2h"},{1J:U.9F}],"32-9E-7R":[{}],"4q-1O":[{}],"7Q-1O":[{35:U.4M,1J:[U.4t,U.6R,U.3K,U.3n,U.6Q],1B:"4a"},{1J:[U.4t,U.6R,U.3K,U.3n,U.6Q,U.5q],1B:"4a"}],"2h-1O-4q":[{35:U.dR,1J:[U.dU,U.dE,U.dM]},{1J:U.dP}],"2h-1O-29":[{35:U.4M,1J:[U.5p,U.5r,U.3n,U.66,U.9I]},{1J:[U.5p,U.4t,U.5r,U.3K,U.3n,U.9I,U.5q],1B:"4a"}],"2h-1O-4N":[{35:U.4M,1J:[U.5p,U.5r,U.3n,U.66,U.9H]},{1J:[U.5p,U.4t,U.5r,U.3K,U.3n,U.9H,U.5q],1B:"4a"}],"2h-1O-di":[{35:U.4M,1J:[U.5p,U.5r,U.3n,U.66,U.9G]},{1J:[U.5p,U.4t,U.5r,U.3K,U.3n,U.9G,U.5q],1B:"4a"}],"2h-1O-dO":[{35:U.4M,1J:[U.9K,U.3n,U.66,U.9J]},{1J:[U.4t,U.9K,U.3K,U.3n,U.9J,U.5q],1B:"4a"}],2y:[{35:U.9A,1J:[U.dg,U.dA]},{}],4r:[{35:U.4M,1J:[U.4t,U.6R,U.6Q,U.4O],1B:"6d"},{1J:[U.4t,U.6R,U.6Q,U.5q,U.4O],1B:"6d"}]},6d:{}};U.2n=1d 14.1g.5z.86("ex",a,U);U.9Z({ec:1c,ea:1c,dW:1c,dV:1c,dI:1c,dH:1c,dG:1c,dN:1c,dZ:1c,dB:1c,dF:1c,dQ:1c,dL:1c});U.on("1F",U.dz,U);U.on("jM",U.dy,U);U.on("2y",U.dx,U);U.on("4r",U.dw,U);U.9U=1d 14.6J("<1D 1v=\'2P-1g-3c-1B 2P-1g-3c-1B-{1B}\'>&#3e;</1D>").jL()},ew:W(){U.1A=14.5u.6Z(U.6c,{6Y:"1A",6S:"jK",1J:U.1U,5l:"9Y: 9X; 49: -6V; jJ: -6V; 2K: 6V; 5k: 6V"})},ev:W(){U.7Z=U.3d(1d 14.jI({x:0,y:0,es:"0",1q:0,1z:U.1H.9r}))},eu:W(){V a=1d 14.1M.85({5y:1d 14.1M.jH([]),3f:1d 14.1M.jG({},14.1g.1I.2L),6b:{84:"1B",et:"jF"},jE:1c});V d=1d 14.32.6a([{73:U.1H.dc,2K:U.1H.db,9i:1h,69:"1B",83:1c,4w:U.en.5x(U)},{73:U.1H.da,2K:U.1H.d9,69:"47",83:1c,4w:U.ek.5x(U)},{73:U.1H.d8,2K:U.1H.d7,69:"4P",83:1c,4w:U.ej.5x(U)}]);U.2D=1d 14.32.3L({ds:a,cm:d,x:0,y:22,es:"0 0",4T:1c,5w:{jD:1c,72:1c},71:1d 14.4S()});U.2D.on("1F",U.dv,U);U.3d(U.2D);U.2D.6P().on("jC",U.du,U)},er:W(){V a=U.2D.e8();a.1Q={};a.1Q.3d=a.ep(1d 14.1g.1I.9W({9V:U.eq,1z:U.1H.d6,3o:U.1H.d5,5v:"2P-1g-3c-jB",2u:U.dt,2a:U}));a.1Q.31=a.81({1z:U.1H.d3,3o:U.1H.d2,5v:"2P-1g-3c-jA",2u:U.dq,2a:U});a.1Q.3l=a.81({1z:U.1H.cZ,3o:U.1H.cX,5v:"2P-1g-3c-jz",2u:U.dn,2a:U});a.3d("-");a.1Q.1O=a.81({1z:U.1H.9u,3o:U.1H.9t,5v:"2P-1g-3c-e4",2u:U.dr,2a:U});a.3d("-");a.1Q.4R=a.ep(1d 14.4S.jy(14.5u.6Z(a.2o(),{6Y:"1D",eo:"2P-1g-3c-4R-9N",82:"&#3e"})));a.3d("->");a.1Q.7Y=a.81({1z:U.1H.cS,3o:U.1H.cQ,2u:U.dm,2a:U})},en:W(a,d,f,g,l,m){1a U.9U.1S({1B:a})},ek:W(a,d,f,g,l,m){if(14.6X.ei()){d.5t=\'2P:9T="\'+14.1P.eh.eg(a)+\'"\'}1f{d.5t=\'2w="\'+a+\'"\'}1a a},ej:W(a,d,f,g,l,m){if(14.6X.ei()){d.5t=\'2P:9T="\'+14.1P.eh.eg(a)+\'"\'}1f{d.5t=\'2w="\'+a+\'"\'}1a a},ef:W(a){V d=1s;V f=a.6W(".");if(f.1p>1){d=f.jx()}1a d},ee:W(a){V d=1c;if(U.4p.1p>0){d=U.4p.4v(U.ef(a))!=-1}1a d},9S:W(a){V d=1h;V f=a.9Q().1l.1q;if(U.ee(f)){d=1c}1f{14.jw.ed(U.1H.cM,2F.3m(U.1H.cK,f,U.4p.4u(U.1H.cL)));d=1h}1a d},9R:W(a){1a U.2M("ec",U,a.9Q().1l.1q)!==1h},9P:W(a){V d=a.7S();d.jv(U.1A);d.9O("2K","6V");d.1l.2O=1c;V f=U.2D.2Z();f.3d(1d 14.1g.1I.2L({1B:14.1g.1I.2L.7O,47:d.1l.1q,4P:U.1H.cH,65:d}));U.2n.2x("2h-eb",d.1l.1q)},80:W(a){U.2M("ea",U,a)},3n:W(){if(U.5n){V a=U.6L(1c);V d=1-a/U.67;U.7Z.e9(d,2F.3m(U.1H.cO,U.67-a,U.67))}1f{U.7Z.e9(0,U.1H.9r)}},3K:W(){V a=U.2D.e8();if(U.5n){a.1Q.31.48();a.1Q.3l.48();a.1Q.1O.3J();if(!U.9C()){a.1Q.7Y.48()}14.2t(a.1Q.4R.2o()).e7("2P-1g-3c-4R-9N","2P-1g-3c-4R-e6");a.1Q.1O.e5("2P-1g-3c-ju");a.1Q.1O.6U(U.1H.cW);a.1Q.1O.2o().2l(a.1Q.1O.68).1l[a.1Q.1O.7X]=U.1H.cT}1f{a.1Q.31.3J();a.1Q.3l.3J();a.1Q.7Y.3J();14.2t(a.1Q.4R.2o()).e7("2P-1g-3c-4R-e6","2P-1g-3c-4R-9N");a.1Q.1O.e5("2P-1g-3c-e4");a.1Q.1O.6U(U.1H.9u);a.1Q.1O.2o().2l(a.1Q.1O.68).1l[a.1Q.1O.7X]=U.1H.9t;if(U.6L()>0){a.1Q.1O.3J()}1f{a.1Q.1O.48()}if(U.2D.6P().jt()){a.1Q.31.3J()}1f{a.1Q.31.48()}if(U.2D.2Z().9x()>0){a.1Q.3l.3J()}1f{a.1Q.3l.48()}}},e3:W(){U.67=U.6L()},e2:W(){U.67++},e1:W(){U.5n=1c},4t:W(){U.5n=1h},66:W(){V d=U.2D.2Z();V f=1s;d.1X(W(a){if(!f&&a.2g("1B")==14.1g.1I.2L.7O){f=a}1f{a.2g("65").1l.2O=1c}});f.2g("65").1l.2O=1h;f.46("1B",14.1g.1I.2L.7N);f.46("4P",U.1H.cG);f.7T();U.2n.2x("2h-1O-4q",f)},e0:W(){U.2M("dZ",U)},dY:W(a){V d=U.2D.2Z();1r(V f=0,g=a.1p;f<g;f++){V l=a[f];l.2g("65").31();d.31(l)}},dX:W(a){1r(V d=0,f=a.1p;d<f;d++){U.2M("dW",U,a[d].2g("47"),a[d])}},9M:W(){V d=U.2D.2Z();d.1X(W(a){a.2g("65").31()});d.jr()},9L:W(){U.2M("dV",U)},dU:W(a){14.6T.7W({1U:U.1U,2E:14.34(a.2g("2E")||{},U.7P||U.4s||U.2E),6S:"dT",1A:U.1A,dS:1c,29:U.dl,5s:U.dj,2a:U,2i:a})},dR:W(a){1a U.2M("dQ",U,a.2g("47"),a)!==1h},dP:W(a){U.2n.2x("2h-1O-dO",a)},9K:W(a){a.46("1B",14.1g.1I.2L.7U);a.46("4P",U.1H.jq);a.7T()},9J:W(a){U.2M("dN",U,a.2g("47"),a)},dM:W(a){U.2M("dL",U,a.2g("47"),a)},5r:W(a){if("29"in a.45&&a.45.29){a.2i.46("1B",14.1g.1I.2L.dK);a.2i.46("4P",a.45.dJ||a.45.4N||U.1H.cA)}1f{a.2i.46("1B",14.1g.1I.2L.7U);a.2i.46("4P",a.45.dJ||a.45.4N||U.1H.9k)}a.2i.7T()},9I:W(a){U.2M("dI",U,a.2i.2g("47"),a.45,a.2i)},9H:W(a){U.2M("dH",U,a.2i.2g("47"),a.45,a.2i)},9G:W(a){U.2M("dG",U,a.2i.2g("47"),a.2i)},5q:W(){U.2M("dF",U)},dE:W(){U.4Q=14.7V().2l("jp.x-4n:jo")},5p:W(){U.4Q=1s},dC:W(){if(U.4Q){U.4Q.dD();U.4Q.1l.2N="jn:jm";U.4Q.31()}U.4Q=1s},6R:W(){U.dC();V d=U.2D.2Z();V f=1s;d.1X(W(a){if(a.2g("1B")==14.1g.1I.2L.7N){f=a;1a 1h}});f.46("1B",14.1g.1I.2L.7U);f.46("4P",U.1H.cz);f.7T()},6Q:W(){U.2M("dB",U)},dA:W(){U.2n.2x("2y")},4O:W(){U.2n.4O()},9F:W(a){a.7S()},dz:W(){U.2n.2x("33-1F")},dy:W(){1a U.9y()?U.9C():1c},dx:W(){U.2n.2x("2y")},dw:W(){U.2n.2x("4r")},dv:W(){U.2n.2x("32-1F")},du:W(){U.2n.2x("32-9E-7R")},dt:W(a){U.2n.2x("2h-64",a)},dr:W(){if(U.5n){U.2n.2x("7Q-1O")}1f{U.2n.2x("4q-1O")}},dq:W(){V a=U.2D.6P().dp();U.2n.2x("31-do",a)},dn:W(){U.2n.2x("3l-5o")},dm:W(){U[U.6O].1i(U)},dl:W(a,d){V f={29:1h,4N:U.1H.9k};2k{V g=a.6N;V l=g.6M(/^<[^>]+>((?:.|\\n)*)<\\/[^>]+>$/);if(l){g=l[1]}f=14.1P.jl.dk(g)}2j(h){}V m={2i:d.2i,45:f};if("29"in f&&f.29){U.2n.2x("2h-1O-29",m)}1f{U.2n.2x("2h-1O-4N",m)}},dj:W(a,d){V f={2i:d.2i,45:{29:1h,4N:U.1H.cF}};U.2n.2x("2h-1O-di",f)},dh:W(){U.2n.2x("4q-1O")},dg:W(){U.2n.2x("7Q-1O")},df:W(){1a U.1U},jk:W(a){U.1U=a},jj:W(){1a U.7P},ji:W(a){U.7P=a},de:W(){1a U.9D},jh:W(a){U.9D=a},9C:W(){1a U.9B},jg:W(a){U.9B=a},9A:W(){1a U.9z},jf:W(a){U.9z=a},je:W(){1a U.4p},jd:W(a){U.4p=a},9y:W(){1a U.5n},dd:W(){1a U.2D.2Z().9x()>0},6L:W(d){V f=0;V g=U.2D.2Z();g.1X(W(a){if(a.2g("1B")==14.1g.1I.2L.7O){f++}if(d&&a.2g("1B")==14.1g.1I.2L.7N){f++}});1a f},4M:W(){1a U.6L()>0},jc:W(){1a U.2D.2Z()}});V p=14.1g.1I.63.7M;p.1H={2w:"\\44\\4K\\43\\3y\\cP\\jb",dc:"\\ja\\j9",db:70,da:"\\44\\4K\\cJ",d9:j8,d8:"\\j7\\j6",d7:j5,d6:"\\d4\\9w",d5:"\\d4\\9w\\44\\4K\\9s\\43\\3y\\4L\\6K\\62",d3:"\\d0\\9v",d2:"\\d1\\6K\\62\\61\\d0\\9v\\44\\4K.",cZ:"\\j4\\cY",cX:"\\j3\\9v\\6K\\62.",9u:"\\43\\3y",cW:"\\cV\\cU",9t:"\\43\\3y\\6K\\62\\61\\4L\\44\\4K\\9s\\cE\\cD\\cC.",cT:"\\j2\\cy\\3y\\5m.",cS:"\\7L\\cR",cQ:"\\7L\\cI\\j1\\j0\\cP.",9r:"\\9q\\iZ...",cO:"\\cN\\9l\\44\\4K\\43\\3y\\43\\3y\\4L {1} \\4L {0} .",cM:"\\9n\\9m",cL:",",cK:"\\9p\\9o\\44\\4K\\4L\\iY\\iX\\cJ\\cI\\iW\\iV\\43\\3y.<br/>\\4o\\9p\\9o\\iU\\62\\4L\\44\\4K\\iT\\iS: {1}",cH:"\\43\\3y\\6K\\62.",cG:"\\43\\3y\\61...",cF:"\\cE\\cD\\cC\\9n\\9m\\cB\\iR\\iQ\\iP\\61\\iO.",cA:"\\43\\3y\\9l\\iN.",9k:"\\3y\\5m\\iM\\iL.",cz:"\\iK\\iJ\\iI\\iH\\cy."};14.1g.6H=W(){U.9e=14.id()+"-2J";U.9j=1d 14.6J(\'<9j 1r="."><1D id="\'+U.9e+\'" 5l="2K:7K%;5k:7K%;cx-x:4n;cx-y:4n;"></1D></9j>\');U.2m=1d 14.1M.iG({7J:[],1M:[[]]});U.iF="";U.cw="cv";U.9i=1c;U.9h="7I";U.9g=14.5j;U.iE=1c;U.9f=1c;U.9c=6I[0].9c||"iD";14.1g.6H.1o.1L.1S(U,6I)};14.1C(14.1g.6H,14.1A.5i,{cu:W(){14.1g.6H.1o.cu.1i(U);if(U.2J&&!U.2J.1t){U.2J.1F(U.9e);V l=U;V m=U.2J;U.2J.on("iC",W(a){l.ct.cs(l.cr.9d(),m.el.6G()+30)});U.2J.on("iB",W(a){l.ct.cs(l.cr.9d(),m.el.6G()+30)});U.2J.on("3x",W(a){V d=(a==l.2J.cq());V f=l.9c;V g=a.iA();if(d&&f!="7I"){1a}1f{if(f=="iz"&&g){1a}1f{if(f=="9b"&&!g){1a}}}l.3w(a.1z);l.iy()});V n=U.2J.cq();if(!n.ix()){n.iw()}}}});', 62, 1656, '||||||||||||||||||||||||||||||||||||||||||||||||||||||||this|var|function|||Efs|||||Ext||||||return|cfg|true|new|getAttribute|else|ux|false|call|case|td|dom|date|break|superclass|length|value|for|null|rendered|Common|class|delete|xtype|extObj|text|form|state|extend|div|setAttribute|render|isDefined|i18n|UploadDialog|action|typeof|constructor|data|isEmpty|upload|util|x_buttons|initConfig|apply|renderTo|url|substr|tr|each|push|select||onEvents||dic|||documentElement|pageSize|code|success|scope|name|type|Button|getDom|href|get|file|record|catch|try|child|store|fsa|getEl|input_file|theMinutes|theHours|xsl|fly|handler|menu|title|postEvent|hide|createDocument|month|switch|toLowerCase|grid_panel|params|String|update|kind|contentEl|tree|width|FileRecord|fireEvent|src|disabled|ext|ProcessAtrributes|getConfig|items|appendChild|iteraterEl|firstChild|txtXML|transConfig|table|getStore||remove|grid|window|applyIf|predicate|btn|default||document|currentDic|Object|uploaddialog|add|160|reader|Field|getAttrConfig|xml|nodeType|accessKey|reset|format|updateProgressBar|tooltip|center|current_state|throw|Date|string|hoursPicker|txtDataIndexCode|setValue|click|u4f20|initComponent|query|datetime|DicField|undefined|Observable|lazyInit|selectSingleNode|txtDataIndexText|txtRowName|enable|updateToolbar|GridPanel|isIE|event|tagName|meta|pageDom|mapping|totalRecords|listeners|replace|dateRenderer|version|className|minutesPicker|getNumber||fieldname||u4e0a|u6587|response|set|filename|disable|left|ready|input|onRender|callback|focus|setCache|box|Panel|eval|isInput|allConfig|addClass|filterType|hidden|u8bf7|permitted_extensions|start|destroy|baseParams|resetUploadingFlag|join|indexOf|renderer|submit|button|TextField|time|DateTimeField|init|childNodes|pluginIterater|picker|hourName|minute|hour|right|u4ef6|u7684|hasUnuploadedFiles|error|flushEventQueue|note|upload_frame|indicator|Toolbar|border|Window|BrowseButton|object|test|continue|renderedFlag||DateField|XmlReader|hint|autoShow||||||setAttribValue|EFSFRAME|innerHTML|tbody|xmlDics|operation|dicField|script|ComboBox|emptyFn|height|style|u8f93|is_uploading|queue|resetUploadFrame|fireUploadCompleteEvent|updateRecordState|failure|attr|DomHelper|iconCls|viewConfig|createDelegate|proxy|Utils|int|while|ToastWindow|BasicForm|allowBlank|Xtypes|TreePanel|TabPanel|u65e5|valueNodeName|getText|parseInt|selModel|getXML|QUERYCONDITION|activeDate|cellspacing|middle|cells|getFullYear|innerText|datatype|contains|template|ownerDocument|xmlDoc||u4e2d|u5217|Dialog|selected|input_element|prepareNextUploadTask|initial_queued_count|buttonSelector|dataIndex|ColumnModel|sortInfo|body|destroyed|size|Action|duration|pos|ctrlKey|TimeField|NumberField|region|Ymd|records|u5b57|applyTo|clientValidation|callRender|TreeLoader|loader|efsframe|emptyText|minuteLabel|hourLabel|align|txt|getMonth|clearTime|ClickRepeater|cloneNode|load|DicPanel|getHeight|ComboBoxTree|arguments|Template|u961f|getQueuedCount|match|responseText|closeAction|getSelectionModel|fireUploadStopEvent|abortUpload|method|Ajax|setText|100px|split|QuickTips|tag|append||bbar|forceFit|header|positions|ToastWindowMgr|TextArea|float|Hidden|Viewport|GroupStore|treepanel|panel|u6708d|u5e74m|loadData|Radio|lastIndexOf|createElement|beforeaction|defaultAccessKey|setTimeout|nextSibling|root|columns|www|buttons|getValue|DateTimeItem|minuteName|mbtn|eventEl|span|parentNode|useDic|hasFocus|parentPath|LocalStore|txtRootName|qryTextField|sv|getNode|addConditionItem|Array|all|fields|100|u5173|prototype|STATE_PROCESSING|STATE_QUEUE|base_params|stop|change|detachInputFile|commit|STATE_FAILED|getBody|request|tooltipType|close|progress_bar|fireFileAddEvent|addButton|html|sortable|field|Store|FSA|onDestroy|original_handler|block|callable|not|trans_table|is_processing|textarea|addListener|radio|must|doRender|getRootPath|xmlreader|codeNodeName|storeLoaded|getDic|VALUE|tabName|override|nodeName|u5165|isValid|waitTitle|waitMsg|setAccessKey|show|createTreeLoader|dateFormat|YmdHi|dicRenderer|expander|cellclick|PREDICATE|pagingBar|reg|DateTimeMenu|showToday|disabledDays|DatetimePicker|setSize|colspan|getDate|dateValue|getTime|down|insertBefore|markInvalid|setCode|nodeValue|LocalXmlStore|writeevent|txtDataIndexASpell|txtDataIndexSpell|xslDic|GET|ActiveXObject|filterTypeDes|element|variable|errors|isInt|tempHtml|beforeend|insertHtml|getExt|leaf|selectNodeModel|getWidth|tplTreeId|forceSelection|onSelect|triggerAction|resizable|tpl|note_upload_error|u6210|u8bef|u9519|u62e9|u9009|u7b49|progress_waiting_text|u5230|upload_btn_start_tip|upload_btn_start_text|u9664|u52a0|getCount|isUploading|reset_on_hide|getResetOnHide|allow_close_on_upload|getAllowCloseOnUpload|upload_autostart|selection|resetAddButton|fireUploadFailedEvent|fireUploadErrorEvent|fireUploadSuccessEvent|fireUploadCanceledEvent|setRecordCanceledState|fireResetQueueEvent|resetQueue|stoped|setStyle|addFileToUploadQueue|getInputFile|fireFileTestEvent|isPermittedFile|qtip|state_tpl|input_name|TBBrowseButton|absolute|position|addEvents|adding|uploading|layout|autoDestroy|draggable|plain|create|container|original_scope|createInputFile|font|adjustInputFileBox|autoWidth|trans_table_scope|slideOut|afterShow|slideIn|task|autoHide|108|setLabelColor|getCache|efs|toolbar|groupstore|range|maxValue|minValue|loadDic|onBeforeQuery|hiddenField|setLabelMust|HttpProxy|_isRendered|getEfs|lastSelectionText|selectValue|ComboXmlReader|u6570|u5f0f|u683c|u5178|afterInitConfig|_ID_txtXML|ignore|u8be2|u67e5|fileUpload|children|TreeNode|dataUrl|beforeload|XmlTreeLoader|createTreeNode|rootVisible|fieldid|u5206|u65f6i|Hi|CheckboxSelectionModel|obserableEventArgs|urn|limit|plugins|colModel|PagingToolbar|open|simplePagingBar|loadMask|getItemConfig|tools|trim|u7801|maxText||minText|disabledDaysText|disabledDatesText|maxDate|minDate|readOnly|Previous|Next||xminute|up|stopEvent|removeClass|mpMinutes||xhour|mpHours|offsetWidth|rows|setDate|startDay|selectToday|with|inner|unselectable|showPrevMonth|showNextMonth|enableDisplayMode|Hour|getCode|validateDic|onBlur|onFocus|createNode|attributes|loaded|parseXml|responseXML|doc|DATAINFO|Error|getDataNode|xmlFiltered|transformNodeToObject|uppercase|lowercase|filter|implementation|async|onKeyupFn|onDicSelect|changeFilterModeFn|modeBtn|qryBtn|buttonTemplate|inputTemplate|getNodeValue|afterAction|onEventRe|setRenderedFlag|PREFID|textContent|selectNodes||makeConditions|makeCondition|getLabel|isString|getEmptyQryXml|isNaN||||dicCache|isObject|getRootNode|list|resizeTo|resizer|expand|local|mode|overflow|u6b62|note_aborted|note_upload_success|u6216|u5668|u52a1|u670d|note_upload_failed|note_processing|note_queued_to_upload|u4e0d|u540d|err_file_type_not_permitted|permitted_extensions_join_str|error_msgbox_title|u5b8c|progress_uploading_text|u7a97|close_btn_tip|u95ed|close_btn_text|upload_btn_stop_tip|u6d88|u53d6|upload_btn_stop_text|reset_btn_tip|u7f6e|reset_btn_text|u5220|u4ece|remove_btn_tip|remove_btn_text|u589e|add_btn_tip|add_btn_text|note_col_width|note_col_title|filename_col_width|filename_col_title|state_col_width|state_col_title|isNotEmptyQueue|getUploadAutostart|getUrl|stopUpload|startUpload|failed|onAjaxFailure|decode|onAjaxSuccess|onCloseButtonClick|onResetButtonClick|files|getSelections|onRemoveButtonClick|onUploadButtonClick||onAddButtonFileSelected|onGridSelectionChange|onGridRender|onWindowDestroy|onWindowHide|onWindowBeforeHide|onWindowRender|repostHide|uploadstop|removeUploadFrame|removeAllListeners|findUploadFrame|uploadcomplete|uploadfailed|uploaderror|uploadsuccess|message|STATE_FINISHED|fileuploadstart|fireFileUploadStartEvent|uploadcanceled|canceled|postFileUploadCancelEvent|beforefileuploadstart|fireBeforeFileUploadStartEvent|isUpload|POST|uploadFile|resetqueue|fileremove|fireFileRemoveEvent|removeFiles|uploadstart|fireUploadStartEvent|setUploadingFlag|incInitialQueuedCount|saveInitialQueuedCount|uploadstartbtn|setIconClass|processing|replaceClass|getBottomToolbar|updateProgress|fileadd|added|filetest|alert|isPermittedFileType|getFileExtension|htmlEncode|Format|isEnabled|renderNoteCell|renderFilenameCell|||renderStateCell|cls|addItem|post_var_name|fillToolbar|anchor|direction|createGrid|createProgressBar|createForm|created|rendering|300|450|Record|hideParent|onInputFileChange|getBox|stopPropagation|register|mouseover|display|namespace|array|callAction|Predicate|boolean|computePredicate|currentStateEventTransitions|transition|has|State|processEvent|EventQueue|process|setTitle|autoScroll|onReady|key|blur|inputType|password|addBoxStyle|textfield|tabpanel|now|datetimefield|altFormats|getConnection|clearInvalid|QUERYINFO|DIC_TEXT|DIC_CODE|row|transform|convert|DomQuery|xmlData|readRecords|getCmp|u4f4d|u4efd||u8eab|idcard|2009|u95f4|u65f6|u671f|getCurrentHint|VTypes|onsubmit|standardSubmit|getOpXml|getQryXml|separator|u5b9a|initDefaultAccessKey|isDynamic|AsyncTreeNode|_xmlloader|sortDir|sortType|colmodel|getAt|recordsperpage|currentpagenum|getDefaultCond|makeQueryXml|ceil|Math|http|u5171|u6761|u5f85|deferEmptyText|u5f55|u8bb0|u65e0|u524d|u5f53|gridpanel|activeTab|Integer|keys|tbar|substring|originalCode|originalValue|RegExp|getOld|u672a|getSex|getBirthday|validateIdcard|tl|formatDate|disabledDatesRE|onTriggerClick||item|Control|Year|hideMinutePicker|Element|onMinuteDblClick|sel|updateMPMinute|getHours|getSize||createMinutesPicker|showMinutesPicker|dblclick|hideHourPicker|onHourDblClick|updateMPHour|createHoursPicker|showHoursPicker|hourText|secondPass|internalRender|setWidth|intDay|getDay|todayText|Number|textNodes|getDaysInMonth|bottom|menuClassTarget|handleDateClick|monthPicker|stopDefault|preventDefault|nextMinuteText|prevMinuteText|nextHourText|prevHourText|thead|th|setMinutes|setHours|Choose|getData|dicValidateBlur|validateValue|unBindTextField|bindTextField|setPosition|processAttributes|XML_NODE_TEXT|XML_NODE_ELEMENT|processResponse|idPath|getPageData|setDoc|remoteSort|getSelectedXml|translate|send|dicBasePath|loadXML|doFilterFn|hasOnKeyup|initPagingBar|u952e|stylesheet|attribute|yes|getDefaultXslTemplate|txtHeaderText|txtHeaderCode|u7f16|250|showAccessKeyHint|showAccessKey|first|wrap|cellpadding|processXmlRet|jsonReturn|errorReader|failureType|headers|isEventAttribute|getDefaultConfig|isStrBoolean|stateEvents|layoutConfig|bufferResize|serializeToString|XMLSerializer|hasChildNodes|transformToFragment|importStylesheet|XSLTProcessor|evaluate|createNSResolver|XPathEvaluator|isExtRender|offsets|disableCaching|ajax|getRootXml|CONDITIONS|TYPE|makeQueryCondition|CONDITION|OPERATION|FIELDNAME|getElementsByTagName|color|applyElement|fnsvPath|An|parseError|execScript||instanceof|||and|like|pred|setcode|setvalue|getvalue||getcode|_Dic|isFloat|isBoolean||isNumber|toString|isArray|reload|isLoaded|collapse|folder|isLeaf|collapsenode|expandnode|exceptRoot|disableKeyFilter|selectedClass|SimpleStore|u7ec8|u6237|u7528|u88ab|u8d25|u5931|u529f|u65ad|u8baf|u901a|u8005|u7f00|u540e|u4e0b|u8bb8|u5141|u5c55|u6269|u5019|u8bdd|u5bf9|u505c|u6e05|u91cd|150|u6ce8|u5907|230|u6001|u72b6|u53e3|getQueueStore|setPermittedExtensions|getPermittedExtensions|setResetOnHide|setAllowCloseOnUpload|setUploadAutostart|setBaseParams|getBaseParams|setUrl|JSON|blank|about|last|iframe|note_canceled|removeAll||hasSelection|uploadstopbtn|appendTo|Msg|pop|Item|resetbtn|removebtn|addbtn|selectionchange|autoFill|pruneModifiedRecords|DESC|JsonReader|MemoryProxy|ProgressBar|top|post|compile|beforehide|dialog|minimizable|maximizable|closable|constrainHeader|minHeight|minWidth|unregister|setTop|setLeft|target|onMouseDown|mousedown|onMouseOver|handleMouseEvents|setOpacity|pointer|cursor|none|relative|context|current|shift|required|Handler|afterHide|disableShadow|animHide|alignTo|animShow|2000|delay|cancel|move|setMessage|DelayedTask|200|info|icon|isReady|keyCode|addKeyMap|keyNav|000000|0000FF|datehour|east|west|south|north|SYS_DOCREADYCOMPLETE|activeReadyRender|gif|images|BLANK_IMAGE_URL|timefield|datefield|allowDecimals|numberfield|lastQuery|displayField|valueField|beforequery|CODE|totalRecordsPath|ROW|srcBase|before|extCmpId|insertSibling|ComponentMgr|off|autocomplete|autoCreate|applyEmptyText|doForce|node|ID|defaultValue|selectNumber|recordType|dicfield|onclick|getParent|checked|toggleValue|u6574|u300117|u4e3a15|u5ea6|u957f|uff1a|u8bc1|uff0b|u636e|vtype|149px|auto|getStyle|doAction|u606f|u4fe1||u4ea4||u63d0|u5728|u6b63|u8bbe|u5370|u6253|u5b58|u4fdd|u8f6c|u56de|u8fd4|u786e|toUpperCase|onEsc|manager|expanded|Site|Top|xmlloader|param|checkbox|singleSelect|RowNumberer|GroupingStore|rowmousedown|rowcontextmenu|rowdblclick|rowclick|cellmousedown|cellcontextmenu|celldblclick|efsframae|sm|asp|empower|u7248|u4eab|EfsV|u7b2c|u793a|u663e|displayMsg|displayInfo|u8f7d||msg|view|layoutOnTabChange|viewport|beforeInitConfig|initValue|u4e32|u7b26||zhunicodeText|u9fa5|||u4e00||zhunicode|u53f7|u6c11|u516c|u621618|u516515|idcardText|old|u522b|u6027|u77e5|u5973|u7537|sex|birthday|menuListeners|ddMatch|DateMenu|beforeDestroy|Menu|relayEvents|handleClick|Adapter|swallowEvent|component|Down|prevYearText|Up|nextYearText|mpSelMinute|defer|isOpera|getBorderWidth|monthNames|nextday|active|prevday|today|POSITIVE_INFINITY|NEGATIVE_INFINITY|86400000|elements|getFirstDateOfMonth|repaint|todayTip|todayBtn|SPACE|EventObject|addKeyListener|todayKeyListener|getMinutes|showMonthPicker|monthYearText|delegate|enter|pageDown|pageUp|showPrevYear||showNextYear|KeyNav|handleMouseWheel|mousewheel|minutecss|tabIndex|hidefocus|dayNames|nextText|prevText|hasClass|minuteText|Minute|DatePicker|getUseCode|invalidText|findRecord|clientHeight|getY|getX|mimicBlur|TAB|getKey|checkTab|beforeselect|monitorTab|TriggerField|textAttribute|handleFailure|endUpdate|beginUpdate|localxmlstore|localstore|setTotalRecords|loadRecords|dir|sort|paramNames|storeOptions|getRequestXml|u4e49|u4e2dfieldid|getDelXml|getRecordByIndex|starts|XMLHttpRequest|getElementById|keyup|getSelected|un|hasListener|mouseout||changeFilterMode|enableKeyEvents|initQryBar|abcdefghijklmnopqrstuvwxyz|ABCDEFGHIJKLMNOPQRSTUVWXYZ|indent|declaration||omit|output|Transform||XSL|1999|org|w3|xmlns|GB2312|encoding|xslTemplate|180|120|queryBar|DIC_ASPELL|DIC_SPELL|u503c|u6df7|u5168|u62fc|endDrag|realign|shadow|getTop|getLeft|onDrag|insertProxy|frame|floating|700|Alt|u6377|u5feb|ButtonToggleMgr|initButtonEl|FUNCERROR|00|ERRORRESULT|standardXmlRet|read|handleResponse|SERVER_INVALID|CLIENT_INVALID|getParams|createCallback|getMethod|options|run|Submit|specified|onEfs|Boolean|needEditor|menuDisabled|titleCollapse|shadowOffset|monitorResize|minButtonWidth|maskDisabled|hideMode|hideCollapseTool|hideBorders|headerAsText|disabledClass|defaultType|ctCls|collapsedCls|collapseFirst|buttonAlign|bodyStyle||bodyBorder|baseCls|autoLoad|autoHeight|animCollapse|allowDomMove|activeItem|defaults|elStyle|setNodeValue|importNode|lastChild|removeChild|transformNode|iterateNext|singleNodeValue|FIRST_ORDERED_NODE_TYPE|XPathResult|loadHTML|urlEncode|conn|getConnectionObject|lib|SPAN|setSpanValue|addRootXml|alias|slice|location|getRelativePath|red|labelFor|isDate|parseDate|childnodes|inside|tc|setRawValue|fieldnameSv|setEditValue|Close|ReadLine|AtEndOfStream|OpenTextFile|FileSystemObject|Scripting|readFile|u4ee3|occurred|parsererror|parseFromString|DOMParser|reason|occured|errorCode|DOMDocument|Msxml2|exec|stype|ssrc|head|1900|1000|more|u677f|u9762|isStrNumber|isFinite|number|Function|isFunction|isPrimitive'.split('|'), 0, {}))